在Docker中搭建JupyterHub服务器
功能需求
因团队项目需要,需组建供多人同时使用的深度学习服务器一台,计划支持以下功能:
- 支持通过浏览器访问服务器
- 支持多用户同时访问,且互不干扰
- 支持在用户间通过共享目录合作开发
- 支持用户使用服务器上的独立显卡
核心思想
在Docker
中开启JupyterHub
服务器
- 由于在本机配置环境时对环境破坏较大,且不易维护,故可采用在
Docker
镜像中部署 - 传统的
Jupyter Notebook
乃至JupyterLab
仅支持单用户访问,不满足需求,故采用支持多人访问的JupyterHub
作为服务器
在服务器中为每个用户开启一个JupyterLab
容器
- 在
JupyterHub
平台上为每个用户单独开启一个Docker
容器 - 在新开启的容器中开启一个
JupyterLab
服务,以支持单人操作
所需软件
理论上可在任何支持Docker
的软件平台上部署,本文在Manjaro Linux操作系统上部署,可通过yay
安装:
git
:用于版本控制docker
与docker-compose
:用于承载平台服务nvidia
与nvidia-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
文件中,services
的environment
下将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以上,考虑在此基础上进行精简自定义
不支持广域网访问
- 可能需要内网穿透等技术,暂时不折腾
用户权限管理过于简单
- 后续有待加强
参考资料
- Introduction to Docker Compose | Baeldung
- https://github.com/jupyterhub/dockerspawner/issues/244#issuecomment-785866378
- DockerSpawner API
- Docker安装多用户版JupyterHub – 标点符
- How to Create a GPU-Powered Containerized Multi-User JupyterHub Research Server? | Tolga Üstünkök’s Personal Web Site
- https://github.com/jupyter/docker-stacks
- https://github.com/iot-salzburg/gpu-jupyter