由于最近参加天池的大模型比赛,在复赛阶段需要制作并提交Docker进行模型的推理,因此在这里记录一下Docker制作的过程。
准备
- featurize
- 阿里云账号
由于需要使用GPU资源,因此选择了预装Docker的featurize服务器。
开通阿里云容器镜像服务
为了将本地构建的 Docker 镜像托管到云端,我们首先需要在阿里云上创建一个容器镜像服务(ACR)实例。这里我们登录到阿里云控制台,选择“容器镜像服务”并创建一个新的个人实例。
在实例创建完成后,需要创建一个命名空间来存放 Docker 镜像。对于个人版,最多可以创建三个命名空间,每个命名空间下可以创建多个 Docker 仓库。
之后在页面左侧选择镜像仓库并点击创建镜像仓库,并进行相关的配置。其中仓库类型如果选择私有则必须登录你的账号后才能够拉取,而公开则不用登录。
完成这些基本设置后,就可以通过命令行将本地构建好的 Docker 镜像推送到阿里云容器镜像服务中了。
构建镜像
接下来我们在本地构建我们的镜像仓库。
安装nvidia-container-toolkit
为了使 Docker 能够访问 GPU 资源,首先需要安装 nvidia-container-toolkit 并重启 Docker 服务。
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
准备项目文件
接下来,组织我们的项目文件,并将所有必需的文件都存放在同一目录下。
制作Dockerfile
Dockerfile 是一个包含一系列指令的脚本文件,用于定义如何构建 Docker 镜像。如下是我的Dockerfile文件:
# 使用阿里云的 CUDA 和 cuDNN 镜像作为基础镜像
FROM ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/cuda:11.8.0-cudnn8-devel-alinux3.2304
# 设置工作目录
WORKDIR /
# 复制项目文件到工作目录
COPY . .
# 安装 Python 开发环境
RUN yum install -y python3-devel
# 安装必要的 Python 库
RUN pip install transformers sentencepiece einops accelerate vllm ipywidgets -i https://pypi.tuna.tsinghua.edu.cn/simple
# 卸载旧版本的 NumPy
RUN pip uninstall -y numpy
# 再次卸载 NumPy,确保没有残留版本
RUN pip uninstall -y numpy
# 安装特定版本的 NumPy
RUN pip install "numpy>=1.17,<2.0.0" -i https://pypi.tuna.tsinghua.edu.cn/simple
命令解释:
- FROM 指令:指定基础镜像。 这里选择了阿里云提供的 CUDA 11.8.0 和 cuDNN 8 的开发版镜像,该镜像还包含了 Alinux 3.2304 版本的操作系统。
- WORKDIR 指令:设置工作目录。这里将工作目录设置为根目录 /。
- COPY 指令:复制文件到镜像中。这里将当前项目目录下的所有文件复制到镜像的工作目录中。
- RUN 指令:执行命令。
构建docker
进入到我们的项目目录中,并执行如下命令来构建 Docker 镜像:(其中llm-train为自己设置的docker名称)
docker build --tag=llm-train .
构建完成后,可以通过运行 docker images 查看已构建的镜像。
运行docker
要启动 Docker 容器并利用 GPU 资源,需要使用以下命令:
docker run -dit --gpus all --privileged --ipc=host -v /root:/root llm-story
为了使用GPU,我们在启动docker的时候需要添加–gpus all参数。并且-v /root:/root能够将我们宿主机的目录映射到docker中。
启动容器后,使用 docker ps 命令检查容器的状态:
根据我们上面获得的IMAGE对应的CONTAINER ID,执行如下命令进入容器内部:
docker exec -it a7aa29e31a46 /bin/bash
推送镜像至仓库
在阿里云创建镜像结束后,会有容器制作的操作指南如下:
首先我们需要登录我们的阿里云Docker Registry
docker login --username=XXXXXX registry.cn-shanghai.aliyuncs.com
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/testabc128/test:[镜像版本号]
docker push registry.cn-shanghai.aliyuncs.com/testabc128/test:[镜像版本号]
其中的[镜像版本号]为非必填选项,如果在推送的时候填入了[镜像版本号],则在拉取的时候也需要填写对应的[镜像版本号]。