背景与问题
人工智能课程与科研项目通常依赖深度学习框架(如PyTorch、TensorFlow)和GPU资源。在实际教学过程中,教师和学生往往需要经历繁琐的环境搭建:安装CUDA、配置Python依赖、解决版本冲突等。此外,多个学生共用一台GPU服务器时,如何隔离环境、分配资源、管理数据也成为巨大挑战。传统物理机或单机虚拟化方案不仅成本高,而且扩展性差,难以满足动态的科研需求。
因此,我们需要一个集中化、容器化、多租户的AI实践平台,支持浏览器访问、按需创建计算环境,并实现数据集和模型的统一存储。
方案设计
本方案基于阿里云ECS构建,使用Docker容器技术实现环境隔离,使用JupyterHub作为多用户Web入口。整体架构如下:
- 用户通过浏览器访问JupyterHub服务。
- JupyterHub通过DockerSpawner为每个用户动态创建独立的Notebook容器。
- 计算节点为阿里云ECS GPU实例,容器共享GPU资源。
- 使用阿里云OSS作为集中存储,通过ossfs挂载到宿主机,再映射进容器,实现持久化数据共享。
选择阿里云ECS作为底层计算资源,是因为它可以快速配置不同规格的GPU实例,同时借助VPC和安全组实现网络隔离。OSS则提供了高可用、低成本的存储方案,非常适合存放教学数据集和模型权重。
该平台的优势在于:
- 环境标准化:所有用户使用统一的Docker镜像,避免“在我机器上能跑”的问题。
- 资源隔离:每个用户独立容器,互不干扰。
- 弹性伸缩:根据在线用户数动态调整容器数量和ECS节点数。
- 成本可控:仅需为实际使用的资源付费。
实现步骤
1. 创建阿里云ECS实例
在阿里云控制台创建一台GPU计算型ECS实例,选择Ubuntu 20.04作为操作系统。建议选择NVIDIA驱动预装或手动安装,并安装Docker CE和NVIDIA Container Toolkit。
# 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 添加NVIDIA Container Runtime
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
注意:以上命令使用了外部脚本,在生产环境中建议使用阿里云镜像源或手动安装。
2. 构建AI教学镜像
创建Dockerfile,基于PyTorch官方镜像,添加JupyterHub组件和常用数据分析库:
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime
RUN pip install --no-cache-dir jupyterhub jupyterlab notebook pandas matplotlib scikit-learn
RUN useradd -m -s /bin/bash jupyter
USER jupyter
WORKDIR /home/jupyter
执行构建:
docker build -t ai-notebook:latest .
该镜像包含了Python环境、PyTorch、JupyterLab以及常用库,学生创建容器后即可开始编程。
3. 配置JupyterHub
创建一个目录用于存放JupyterHub配置,例如 /opt/jupyterhub。编写 jupyterhub_config.py:本步骤是配置JupyterHub使用DockerSpawner的关键。
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
c.DockerSpawner.image = 'ai-notebook:latest'
c.DockerSpawner.network_name = 'jupyterhub-network'
c.DockerSpawner.remove = True
c.DockerSpawner.extra_hosts = {
'host.docker.internal': 'host-gateway'}
# 挂载OSS或NFS数据目录
c.DockerSpawner.volumes = {
'/data': '/home/jupyter/data',
}
# 使用NativeAuthenticator不依赖外部认证服务
c.JupyterHub.authenticator_class = 'nativeauthenticator.NativeAuthenticator'
c.NativeAuthenticator.open_signup = True
# 指定Hub的IP和端口
c.JupyterHub.hub_ip = '0.0.0.0'
c.JupyterHub.port = 8000
还需要使用docker-compose来启动JupyterHub。编写 docker-compose.yml:
version: '3.4'
services:
jupyterhub:
image: jupyterhub/jupyterhub:2.0
container_name: jupyterhub
ports:
- '8000:8000'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/jupyterhub/jupyterhub_config.py:/etc/jupyterhub/jupyterhub_config.py:ro
environment:
DOCKER_SPAWNER_IMAGE: ai-notebook:latest
JUPYTERHUB_NETWORK_NAME: jupyterhub-network
restart: unless-stopped
注意,需要提前创建docker网络:
docker network create jupyterhub-network
4. 挂载阿里云OSS存储
为了让学生共享数据集,我们把OSS bucket通过ossfs挂载到ECS实例的 /data 目录。安装ossfs后执行:
echo my-access-key:my-secret-key > /etc/ossfs/passwd
chmod 640 /etc/passwd-ossfs
ossfs my-bucket /data -ourl=oss-cn-hangzhou.aliyuncs.com -o allow_other
为了开机自动挂载,可以将命令写入 /etc/fstab。注意AccessKey需要妥善管理,建议使用RAM子账号权限,仅授予该bucket的读写权限。
5. 启动平台
docker-compose up -d
等待启动完成后,用户即可通过 http://ECS公网IP:8000 访问JupyterHub,注册账号并选择Notebook环境。
代码示例:在Notebook中运行训练任务
进入JupyterHub后,用户可以新建Notebook,运行以下简单示例代码,验证GPU可用性和数据读取:
import torch
import pandas as pd
# 检查GPU是否可用
print('CUDA available:', torch.cuda.is_available())
print('Device count:', torch.cuda.device_count())
# 读取共享数据集(已挂载至/data)
df = pd.read_csv('/home/jupyter/data/titanic.csv')
print(df.head())
# 简单张量计算
x = torch.rand(3, 3).cuda()
print(x)
以上代码在容器内执行,其中PyTorch已预装。如果GPU驱动和容器工具包配置正确,输出可以看到CUDA设备。
注意事项
- 网络与安全:确保ECS安全组开放8000端口,且仅允许校园网或特定IP访问,避免未授权访问。
- 数据持久化:容器内文件在容器删除后会丢失,务必将所有数据和模型保存在挂载的宿主机目录(如
/data),并定期备份到OSS跨区域冗余存储。 - 资源配额:为避免单个用户占用全部GPU或内存,可在DockerSpawner中设置
c.DockerSpawner.cpu_limit和c.DockerSpawner.mem_limit,使用Docker资源限制功能。 - 镜像更新:更新镜像后需要重新拉取,并清理旧镜像,以节省磁盘空间。
- 成本控制:教学高峰期可临时扩容ECS实例,空闲时释放,并结合阿里云竞价实例降低成本。
- 认证安全:建议使用LDAP或OAuth认证,并关闭开放注册。
总结
本文提出了一种基于阿里云ECS、Docker和JupyterHub的AI教学科研实践平台搭建方案。该方案能够显著降低环境配置复杂度,提高GPU资源利用率,并为学生提供统一可靠的云端编程环境。借助阿里云OSS的数据持久化能力,平台可以积累高质量教学数据集和模型库。未来可进一步结合阿里云容器服务ACK实现容器集群的自动伸缩,或使用阿里云PAI中的DSW实例直接提供托管式Notebook,实现更轻量化的运维管理。
该平台已在多个课程中试点,反馈良好,证明其在AI教学与科研场景下具有较强的实用性和可复制性。