(九)调试运行在Docker容器中的AI代码

目录

介绍

设置Visual Studio Code

容器配置

配置项目以在Docker中工作

启动容器

在容器中调试代码

总结


介绍

Docker等容器技术可简化依赖项管理并提高软件的可移植性。在本系列文章中,我们探讨了Docker在机器学习(ML)场景中的使用。

本系列假设您熟悉AI/ML、容器化,尤其是Docker

在本系列的上一篇文章中,我们已经通过暴露推断NLP模型REST API使用快速APIGunicornUvicorn worker。它允许我们在网络浏览器中运行我们的NLP模型。

在本文中,我们将使用Visual Studio Code来调试在Docker容器中运行的服务。欢迎您下载本文中使用的代码。

设置Visual Studio Code

我们假设您熟悉Visual Studio Code,这是一个非常轻便灵活的代码编辑器。它适用于WindowsmacOSLinux。由于其可扩展性,它支持无休止的语言和技术列表。您可以在官方网站上找到大量教程。

我们将使用它来运行和调试我们的Python服务。首先,我们需要安装三个扩展:

安装后,我们可以打开我们的项目(在上一篇文章中创建)。或者,您可以下载本文的源代码。在以下示例中,我们假设您选择了后一个选项。

容器配置

我们将使用与之前使用的相同的Dockerfile和几乎相同的docker-compose.yml。我们引入的唯一变化是新的镜像名称,仅用于保持文章和镜像名称之间的一对一关系。你的 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}'

配置项目以在Docker中工作

现在,我们需要指导Visual Studio Code如何运行我们的容器。我们使用.devcontainer文件夹中的两个新文件(不要错过开头的点)。

第一个文件docker -compose-overwrites.yml定义了docker-compose.yml部分,当我们使用Visual Studio Code的容器时,我们希望添加或更改这些部分。因为在开发过程中我们要编辑我们的本地代码,我们需要一个新卷来将本地文件映射到容器的文件夹。

此外,我们希望覆盖命令语句,因为在这种情况下,我们不希望始终与容器一起启动我们的服务。相反,我们想要一个无限循环,让我们的容器保持活力。

它引导我们到以下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"

接下来,我们需要一个配置文件devcontainer.json

{
   "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属性中,我们定义Visual Studio Code实例将打开哪个容器的文件夹作为其工作区。该extensions属性确保安装允许我们调试代码的Python扩展。该文件以要转发到主机的端口以及选择运行容器的用户名结尾。您可以查看此文件中可用选项的完整参考

启动容器

您可能还记得在我们之前的系列中,当您将本地文件夹映射为容器的卷时,您需要正确匹配本地用户和容器的用户。当容器的工作,Visual Studio代码在WindowsMacOS尝试自动为您代劳,描述在这里

你仍然需要在Linux上自己处理它。我们将通过在启动Visual Studio Code环境时设置所需的环境变量来实现:

$ USERID=$(id -u) GROUPID=$(id -g) code .

从包含项目Dockerfile的文件夹执行此操作。

请注意,如果您使用上一篇文章中的代码创建了mluser_cache卷,则还需要使用此方法在 macOS上设置Visual Studio Code的环境变量。这将确保当前容器用户可以访问通过运行早期容器写入卷的文件。

如果您认为可以将USERIDGROUPID环境变量添加到单独的文件中并使用docker-compose.ymlenv_file设置,那么不——您不能。我们在构建镜像时需要这些值,但这些env_file值只传递到正在运行的容器。

我们现在准备启动我们的容器。为此,我们单击左下角的打开远程窗口按钮:

然后我们从下拉菜单中选择Reopen in Container选项:

而且……就是这样。现在我们等待我们的镜像被构建,我们的容器启动,以及Visual Studio Code在其中安装它的所有依赖项。

作业完成后,我们会得到一个标准的工作区视图。确保我们真的在容器内部的唯一方法是验证终端窗口中可见的路径和左下角的Dev Container名称:

在容器中调试代码

现在我们可以像在本地一样使用我们的应用程序,包括调试。

至少有两种方法可以调试我们的FastAPI服务。在第一个中,我们将直接启动开发服务器的代码添加到我们的main.py脚本中。第二个要求我们为Uvicorn服务器模块定义专用的调试配置。

让我们尝试第一种方法。我们只需要在上一篇文章中的main.py文件的末尾添加几行代码:

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

有了这个更改,我们只需使用默认Python: Current File调试配置运行我们的代码。

当您将鼠标悬停在上面日志中正在运行的服务http://0.0.0.0:8000 )IP和端口上时,您会注意到一个弹出窗口:使用转发端口跟踪链接。这非常重要,因为在Visual Studio Code中运行时,我们的服务端口会随机转发到一个端口。但是,当我们单击弹出窗口时,我们会转到正确的地址。当我们手动添加/docs后缀时,我们会像以前一样进入OpenAPI接口:

现在,当我们在代码中定义并命中断点时,它的行为与我们预期的一样:

总结

我们已成功配置Visual Studio Code以在Docker容器中编辑、运行和调试我们的代码。多亏了它,我们可以轻松地在本地开发机器、本地服务器或云中使用相同的环境。在下面的文章中,我们将使用Azure容器实例将我们的NLP API服务发布到Azure。敬请关注!

https://www.codeproject.com/Articles/5302895/Debugging-AI-Code-Running-in-a-Docker-Container

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值