使用场景
在我们学习使用各种AI的学习框架的时候,通常会使用Conda,如果我们想要将研究的框架发布到服务器来使用的时候就需要一些部署的方案,这里我们的方案就是Docker+Jupyter的方式。
需要的环境
在这里我使用的是Windows的环境,Linux同学请自行研究
Docker
下载安装Windows下的Dokcer工具Docker Desktop
Jupyter镜像
这里需要注意,根据你的AI框架所需的python版本进行拉取不同的Jupyter镜像
提供一下拉取docker镜像的地址分享(需要梯子)
https://hub.docker.com/r/jupyter/base-notebook/tags
使用
compose运行
docker容器的创建推荐借用docker-compose.yaml文件。将docker-compose.yaml文件放置在哪个文件夹,这个文件夹会作为组的效果将所有文件中的容器放在一组,方便管理。
server:
container_name: server
image: hc_server:1.0
user: root
ports:
- "3005:3005"
- "8887:8888"
volumes:
- "D:\\docker\\commondir:/home/root/commondir"
environment:
- JUPYTER_TOKEN=123
- NB_UID=0
- NB_GID=0
- NB_USER=root
- NOTEBOOK_ARGS=--allow-root
working_dir: /home/root
command: ["sh", "start.sh"]
restart: always
上面是一个容器的信息
container_name:容器名称
image:镜像名称和版本
user:使用的用户,这里的root要注意,因为默认的用户没有sudo的权限,所以推荐我们后期给容器安装工具不希望遇到麻烦最好使用root
ports:容器内外的端口映射,不写IP就会是0.0.0.0
volumens:磁盘映射路径
enviroment:环境变量,这里的JUPYTER_TOKEN是jupyter使用的必须,如果不指定需要在容器运行的时候查看输出日志中会有token字符串,这里推荐指定一个自己想要的就不需要再看日志了。
working_dir:指定容器内的工作目录路径
command:当容器运行的时候运行的脚本
第一次使用时对于环境使用的技巧
这里只介绍一下我搭建时的技巧使用,第一次使用compose文件运行容器,这个时候是没有command参数的(因为容器内没有start.sh文件),我会首先创建一个start.sh文件,内容如下:
# workspace是我的默认工作目录
cd /workspace
# 启动 Jupyter
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='123' > /workspace/jupyter.log 2>&1 &
# PaddleSpeech是我的项目代码,里面有运行文件testapi.py
echo "Starting script..." > /workspace/PaddleSpeech/debug.log
cd /workspace/PaddleSpeech
echo "Changed directory to /workspace/PaddleSpeech" >> /workspace/PaddleSpeech/debug.log
# 启动应用程序 这里可以写你要容器开始时运行的命令(如果环境还没有配置好可以先注释掉)
# python3 testapi.py > server.log 2>&1 &
echo "Started Jupyter Notebook" >> /workspace/debug.log
# 保持容器运行
tail -f /dev/null
然后试用提交命令将当前的容器提交成为新的景象
docker commit [容器ID] [镜像名称]:[版本号]
修改compose文件加入command参数
command: ["sh", "start.sh"]
这样再次创建的容器就可以进行运行环境部署了,这里说明一下这么做的原因,默认的jupyter环境会导致我们运行脚本的时候不会运行启动jupyter环境,这样就会服务运行的时候没有办法通过jupyter进行调试和查看。而使用脚本启动的jupyter环境和我们默认使用的用户环境不同,会导致一些已经配置好的环境文件的丢失。
服务的启动
Jupyter环境内将服务跑通以后,最简单的方式就是在上面的command中直接指定运行命令。有的时候这个运行命令会比较多,所以推荐另一种方式,在工作目录下面创建一个文件start.sh,这样命令中只需要command: ["sh", "start.sh"]
的写法就可以了。