AI 项目对 python 和各个组件的版本与依赖总会比较麻烦,尤其是一些模型或安装包在国内找不到合适的镜像,再或者服务器无法访问公网,或是可以访问但多少受到一些限制,所以拉个 docker 可以部分解决一些问题。
首先编辑 dockerfile 文件,根据 AI 项目所使用的模型和组件包指定 python 的版本,创建用户及路径,并设置路径所属用户权限,然后指定用户和工作路径,最后是 docker 启动时调用的启动脚本。项目中所使用到的模型、算法和实现可以根据情况复制到 docker 内部,也可以在启动的时候通过挂载的方式访问。
# 创建基础镜像
FROM python:3.10.13
# 创建用户路径
RUN useradd -m xiaoming
# 修改路径归属
RUN chown -R work /home/xiaoming
# 设置工作目录
USER xiaoming
WORKDIR /home/xiaoming
# 复制相关文件
# COPY ./models/my-models /home/xiaoming/my-models
# 启动系统服务
ENTRYPOINT ["bash","/home/xiaoming/xiaoming-services/scripts/start.sh"]
dockerfile 文件编辑完成以后,在当前路径下执行下面命令,其中 xiaoming-services 为构建的镜像名称,model 为镜像标签和版本。再等待一段时间以后,docker 镜像就构建完成了,上述镜像在不复制相关文件的情况下,镜像尺寸大约占用 1G 磁盘空间。
docker build -t xiaoming-services:model .
docker 镜像创建完成以后,可以执行下面命令启动容器。gpus 参数允许 docker 使用 gpus 资源,参数 name 为容器名称,参数 itd 允许以交互模型运行容器,并为其分配一个伪终端,同时要求该容器以后台模式运行,并返回启动容器 ID。参数 p 为容器端口到主机端口映射,参数 v 为绑定容器挂载点到主机目录,这里挂载的目录和文件,即可以复制到容器内,也可以通过挂载的方式访问,命令的最后是容器的名称和标签或版本号。
docker run --gpus all --name my-model -itd -p 9081:9081 -v /home/xiaoming:/home/xiaoming xiaoming-services:my-model
如果容器启动正常的话,可以执行下面命令登录容器,其中 64c25bc66fae 为容器 ID,/bin/bash 为打开终端交互,这时执行进程查看指令,即可看到项目进程的各项信息了。如果此时杀掉进程或进程异常终止,容器本身也会终止。
docker exec -it 64c25bc66fae /bin/bash
下面是 docker 容器的打包和还原命令,以及设置容器随 docker 服务自启命令。
# docker 打包
docker save my-services:my-model -o my-services:my-model.tar.gz
# docker 解压
docker load -i my-model.tar.gz
# docker 自启
docker update --restart=unless-stopped my_container