功能需求

因团队项目需要,需组建供多人同时使用的深度学习服务器一台,计划支持以下功能:

  • 支持通过浏览器访问服务器
  • 支持多用户同时访问,且互不干扰
  • 支持在用户间通过共享目录合作开发
  • 支持用户使用服务器上的独立显卡

核心思想

Docker中开启JupyterHub服务器

  • 由于在本机配置环境时对环境破坏较大,且不易维护,故可采用在Docker镜像中部署
  • 传统的Jupyter Notebook乃至JupyterLab仅支持单用户访问,不满足需求,故采用支持多人访问的JupyterHub作为服务器

在服务器中为每个用户开启一个JupyterLab容器

  • JupyterHub平台上为每个用户单独开启一个Docker容器
  • 在新开启的容器中开启一个JupyterLab服务,以支持单人操作

所需软件

理论上可在任何支持Docker的软件平台上部署,本文在Manjaro Linux操作系统上部署,可通过yay安装:

  • git:用于版本控制
  • dockerdocker-compose:用于承载平台服务
  • nvidianvidia-container-toolkit:用于驱动显卡并被Docker容器识别

主要步骤

克隆仓库 jupyterhub-deploy-docker至本地

git clone https://github.com/jupyterhub/jupyterhub-deploy-docker.git

自定义少量配置

  • 修改每个用户启动jupyter notebook所用镜像为cschranz/gpu-jupyter以支持nvidia显卡
    • docker-compose.yaml文件中,servicesenvironment下将DOCKER_NOTEBOOK_IMAGE的值修改为cschranz/gpu-jupyter:latest
      # JupyterHub will spawn this Notebook image for users
      DOCKER_NOTEBOOK_IMAGE: cschranz/gpu-jupyter:latest
      
  • 设置多用户均可访问的共享文件夹/home/jovyan/shared,可在其内实现多人合作开发
    • jupyterhub_config.py文件中,修改变量c.DockerSpawner.volumns的值:
      # Mount the real user's Docker volume on the host to the notebook user's
      # notebook directory in the container
      c.DockerSpawner.volumes = {
          'jupyterhub-user-{username}': notebook_dir,
          'jupyterhub-shared': {
              'bind': '/home/jovyan/shared',
              'mode': 'rw'
          }
      }
      
  • 令单用户容器可访问主机显卡
    • jupyterhub_config.py文件中,新增若干行以设置变量c.DockerSpawner.extra_host_config的值:
      import docker
      
      c.DockerSpawner.extra_host_config = {
          "device_requests": [
              docker.types.DeviceRequest(
                  count=-1,
                  capabilities=[["gpu"]],
              ),
          ],
      }
      

开启、关闭jupyterhub服务

  • 拉取创建用户jupyterlab所需镜像

    docker pull cschranz/gpu-jupyter
    
  • 开启jupyterhub服务器

    docker-compose up -d
    
  • 关闭jupyterhub服务器

    docker-compose down
    

后续设置

  • 在开启服务后,为主机的共享目录加入其他用户的写入权限(默认无法写入)
      sudo chmod -R o+rw /path/to/docker/volumns/jupyterhub-shared
    

用户使用

  • 若服务器的IP地址为x.x.x.x,则可访问http://x.x.x.x:8000
  • 首次使用须注册账号,后可凭此账号登录并使用

其他问题

cschranz/gpu-jupyter镜像占用空间过多

  • 目前占用20G以上,考虑在此基础上进行精简自定义

不支持广域网访问

  • 可能需要内网穿透等技术,暂时不折腾

用户权限管理过于简单

  • 后续有待加强

参考资料