在机器学习和人工智能领域,容器化技术如Docker提供了一种便捷的方式来打包、分发和运行应用程序。本文将探讨如何在Visual Studio Code中使用Docker来调试机器学习服务。
Visual Studio Code(VS Code)是一个轻量级且灵活的代码编辑器,支持Windows、macOS和Linux平台。它的可扩展性使得它能够支持众多语言和技术。本文假设已经熟悉VS Code,并准备使用它来运行和调试Python服务。首先,需要安装三个扩展:
在VS Code中,通过扩展市场搜索并安装以下三个扩展:
将使用与之前相同的Dockerfile和几乎相同的docker-compose.yml文件。唯一的变化是引入了新的镜像名称,以保持文章和镜像名称之间的一一对应关系。
version: '3.7'
volumes:
mluser_cache:
name: mluser_cache
services:
mld09_transformers_api_debug:
build:
context: '.'
dockerfile: 'Dockerfile'
args:
USERID: ${USERID}
image: 'mld09_transformers_api_debug'
volumes:
- mluser_cache:/home/mluser/.cache
ports:
- '8000:8000'
user: '${USERID}:${GROUPID}'
现在,需要指导VS Code如何运行容器。通过在.devcontainer文件夹中添加两个新文件来实现这一点(注意文件夹名称前的点)。
第一个文件docker-compose-overwrites.yml定义了想要在通过VS Code工作时添加或更改的docker-compose.yml的部分。因为在开发过程中想要编辑本地代码,所以需要一个新的卷来映射本地文件到容器的文件夹。此外,想要覆盖命令语句,因为在这种情况下不想总是随着容器的启动而启动服务。相反,想要一个无限循环来保持容器存活。这导致得到以下docker-compose-overwrites.yml:
version: '3.7'
services:
mld09_transformers_api_debug:
volumes:
- .:/home/mluser/workspace:cached
command: /bin/sh -c "
while sleep 1000; do :; done"
{
"name": "Inference Service NLP Debug Container",
"dockerComposeFile": [
"../docker-compose.yml",
"docker-compose-overwrites.yml"
],
"service": "mld09_transformers_api_debug",
"workspaceFolder": "/home/mluser/workspace",
"settings": {
"terminal.integrated.shell.linux": null
},
"extensions": [
"ms-python.python"
],
"forwardPorts": [
8000
],
"remoteUser": "mluser"
}
大多数选项都是相当直观的。在其他事项中,定义了要加载的docker-compose文件(以及加载顺序)。在workspaceFolder属性中,定义了哪个容器的文件夹将被VS Code实例作为其工作区打开。extensions属性确保安装Python扩展,这将允许调试代码。文件最后列出了要转发到主机的端口,以及选择运行容器的用户名称。
可能还记得,当将本地文件夹映射为容器的卷时,需要正确匹配本地用户和容器的用户。当在Windows和macOS上使用容器时,VS Code会尝试为自动执行此操作,如所述。
在Linux上,仍然需要自己处理它。将通过在启动VS Code环境时设置所需的环境变量来做到这一点:
$ USERID=$(id -u) GROUPID=$(id -g) code .
请从包含项目Dockerfile的文件夹中执行此操作。
现在已经准备好启动容器了。要做到这一点,请点击左下角的“Open a remote window”按钮:
然后从下拉菜单中选择“Reopen in Container”选项:
然后...就是这样。现在等待镜像被构建,容器启动,VS Code在其中安装所有依赖项。
当工作完成后,得到了一个标准的工作区视图。唯一确保真的“在”容器内的方法是验证终端窗口中可见的路径和左下角的Dev Container名称:
现在可以像在本地一样使用应用程序,包括调试。
至少有两种方法可以调试FastAPI服务。第一种方法是将代码添加到main.py脚本中,以直接启动开发服务器。第二种方法需要为Uvicorn服务器模块定义一个专用的调试配置。
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
有了这个变化,只需使用默认的Python: Current File调试配置来运行代码。