VSCode&Docker
关于如何让保障机连公司外网下载 VsCode 插件的操作
目前我们有一台公用的可以连公司外网的服务器, IP地址是 172.xx.x.xx, 我在上面挂载了一个 Squid 代理, 端口号为 10022. 现在大家只需要在自己的保障机 (不能连外网) 上配置代理地址为 http://172.xx.x.xx:10022
即可通过代理访问外网, 具体操作如下
1 | 1. 连接保障机 |
之后可以正常通过 VsCode 的 Remote-SSH 来连接保障机, 会通过网络自动下载/更新/同步插件
如何在保障机上离线安装VSCode插件
备注:目前保障机虽然已经连网, 但是还是不能通过网络自动下载/更新VSCode插件. 包括公用机器也不能通过 Install in SSH
下载VSCode插件, 在公用机器上下载插件会报错 无法解析不存在的文件
, 当前这个问题还没有解决.
现在可行的替代方案是在 Extensions for Visual Studio Code 中下载插件的 VSIX 文件, 然后将插件上传到保障机中, 再在VSCode中通过 Extensions
>...
>Install from VSIX...
离线安装插件.
如何离线安装 vscode-server
vscode 远程 linux(包括离线vscode-server安装,免密登录方法)
1 | commit_id=xxx |
1 | 📦~/.vscode-server |
1 | ~/ |
1 | ~/configvscode.sh |
Docker的简单使用
配置Docker环境
首先需要在服务器上配置Docker环境. 我们申请的保障机在拿到手后应该都已经配置好Docker环境了, 可以通过在终端中输入 docker --version
命令来检查, 如果没有配置Docker环境就额外再配置一下.
备注: 我们保障机的系统是 Ubuntu 20.04.6 LTS, 可以在终端中通过 cat /etc/os-release
来输出. Ubuntu和Centos系统Docker的安装可以参考这两篇博客
从远端拉取Docker镜像
关于Docker镜像源
正常来说我们的保障机是不能连接公司外网的, 即我们不能访问一些公开的Docker镜像源 (通过代理访问是后话). 公司为我们提供一个公司内网可以访问的docker镜像源 harbor.4pd.io, 通过共享账号
1 | test # username |
登录. 我们可以在其中搜索/查看/下载已经提交过的Docker镜像, 例如当前 (2024-7-1) 基础模型 希腊语能力榜 v3 的榜首, 由 guohongjie 所提交的镜像就保存在 guohongjie_basemodel_russian_ability 中. 大家可以在自己所关注的榜单和模型中查找到对应的镜像文件.
下载Docker镜像
首先需要在保障机的终端中通过命令登录harbor镜像源的公用账号.
1 | docker login harbor.4pd.io -u test -p Harbor@test01 |
之后使用 docker pull
命令拉取对应的镜像源, 例如拉取当前希腊语能力榜榜首的镜像
1 | docker pull harbor.4pd.io/lab-platform/pk_platform/model_services/guohongjie_basemodel_russian_ability:0.0.4 |
镜像的名称可以在榜单源码的详细信息中查找到. 下载完成后可以通过命令
1 | docker images # 列出本机上的所有镜像 |
来查看本机上的所有镜像.
由镜像创建一个容器
使用 docker run
命令为 IMAGE
创建一个新的容器, 并运行一个 [COMMAND] [ARG...]
, 详见 Docker run 命令 | 菜鸟教程
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
例如下面的语句使用 docker run
命令为镜像 harbor.4pd.io/lab-platform/pk_platform/model_services/guohongjie_basemodel_russian_ability
创建一个新的容器, 容器的名字叫做 mycontainer
.
1 | docker run -it --privileged=true --name mycontainer harbor.4pd.io/lab-platform/pk_platform/model_services/guohongjie_basemodel_russian_ability:0.0.4 /bin/bash |
参数说明
-i
参数表示以交互模式运行容器,-t
参数表示为容器重新分配一个伪输入终端;- 当使用
--privileged=true
选项运行容器时, Docker会赋予容器几乎与主机相同的权限. 具体来说, 这个选项做了以下两件事情: 1.给容器添加了所有的 Capabilities; 2.允许容器访问主机的所有设备. 这意味着在一个privileged=true的容器中, 我们可以做很多平时不能做的事情, 例如加载内核模块、直接操作硬件设备等; /bin/bash
为 linux 终端的命令, 表示在容器中默认启动一个bash. 其作用是载入容器后运行bash, docker容器中必须要保持一个进程的运行, 要不然整个容器启动后就会马上结束(kill).- 此外可以通过添加
-d
参数为容器指定后台运行, 即创建一个容器但不进入该容器, 终端依然处在主操作系统下, 并返回该容器的 Container Id.
执行该命令后会自动创建一个新的容器, 并进入容器的 bash 终端, 以及cd进入镜像配置文件 Dockerfile 中所指定的 WORKDIR. 此时我们已经在容器中了 (如果没有加 -d
参数), 可以执行一些终端命令来查看容器的信息, 例如
1 | cat /etc/os-release # 查看操作系统版本 |
在容器中可以通过 exit
命令来退出一个容器
1 | exit # 退出当前容器, 回到主操作系统 |
对容器的简单操作
在主操作系统中可以通过 Docker ps 命令 | 菜鸟教程 来查看已经创建的容器, 列出包括容器的 CONTAINER ID, IMAGE, STATUS 和 NAMES 等信息.
1 | docker ps # 列出所有正在运行的容器 |
其中 STATUS 容器状态包括 Created
(已创建), Restarting
(重启中), Running
/Up
(运行中), Removing
(迁移中), Paused
(暂停), Exited
(停止), Dead
(死亡). 例如 Up 3 days
表示这个容器已经了连续运行 3 天了, Exited 10 minutes ago
表示这个容器在 10 分钟之前退出.
在主操作系统中 (容器外) 通过 start
命令来启动一个停止运行的容器
1 | docker start [CONTAINER ID]/[NAME] # 启动一个关闭的容器 (默认后台运行) |
通过添加参数 -i
将以交互模式启动容器, 在终端中对容器进行操作.
在主操作系统中 (容器外) 通过命令 restart
命令来重启一个正在运行的容器
1 | docker restart [CONTAINER ID]/[NAME] # 重启一个正在运行的容器 |
在主操作系统中 (容器外) 通过命令 stop
命令来关闭一个正在运行的容器
1 | docker stop [CONTAINER ID]/[NAME] # 关闭一个正在运行的容器 |
通过 Docker rm 命令 | 菜鸟教程 来删除一个容器
1 | docker rm -f [CONTAINER ID]/[NAME] |
提交镜像
使用 docker commit
命令来从已经修改好的容器提交一个新的镜像
1 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
在容器中使用nvidia机器
如果在创建容器的时候不指定 runtime=nvidia
, 那么在容器中通过 vllm.entrypoints.openai.api_server
运行大模型服务时会报错 ImportError: /usr/lib/x86_64-linux-gnu/libcuda.so.1: file too short
. 解决这个问题需要先在保障机中安装 nvidia-container-toolkit
1 | apt-get install -y nvidia-container-toolkit |
在创建容器的时候指定 --runtime=nvidia --gups all
1 | docker run -dit --runtime=nvidia --gpus all --privileged=true --name mycontainer harbor.4pd.io/lab-platf |
之后在容器中重新尝试运行
1 | python -m vllm.entrypoints.openai.api_server --model /root/Qwen2-7B-Instruct --served-model-name llm --trust-remote-code --port 10086 --api-key 123456 |
使用挂载卷
建议容器仅仅作为一个代码运行环境, 不要在其中存储代码和数据, 因为数据集和模型权重往往体积庞大, 将其存在容器中会导致此后所 build 的镜像体积越来越大. 一个比较合适的解决方案是将数据集/模型权重/代码存放在主机目录中, 在通过基础镜像 (其中只包含运行代码所需要的环境) run 容器时, 通过 --volume
参数来将主机目录挂载到容器中.
1 | docker run -dit \ |
如何通过VSCode连接Docker容器
VSCode是可以像连接服务器一样连接Docker容器的, 通过Dev Containers插件可以非常方便的从本地连接运行在服务器上的容器, 从而大大简化对容器中代码的修改和调试过程.
安装 Remote-SSH 插件
首先需要在 MacOS 上安装 VSCode 以及安装 Remote-SSH 插件, 然后在 ssh config 中添加保障机的配置信息, 例如我的保障机的配置信息如下
1 | Host myserver |
之后通过 Remote-SSH 连接保障机. 注意这里我提前配置了代理, 所以我的保障机可以访问公司外网, 所以在SSH连接过程中, 我的保障机能够通过网络直接下载 vscode-server. 如果你的保障机没有配置代理, 可以尝试按照前文提到的方式配置代理, 或者在保障机上从本地离线安装 vscoder-server.
安装 Dev Container 插件
在保障机上安装 Dev Container 插件, 方法同 Remote-SSH. 安装完成后在 VSCode 的左侧栏中会出现一个 Remote Explorer 图标 (和Remote-SSH同一个图标), 其顶部菜单可以在 Remotes(Tunnels/SSH) 和 Dev Containers 两者间切换.
连接运行中的容器
首先需要本地 VSCode 连接保障机, 之后可以在左侧栏的 Remote Explorer > Dev Container 中查看到保障机上创建的容器, 选择目标容器进行连接. 之后的操作和在本地类似.
备注: 有些神奇的是在挂了代理的保障机上直接通过网络安装 VSCode 插件不行, 但是对于运行在保障机上的容器却可以直接安装 VSCode 插件. 只在在保障机上通过代理网络下载 VSCode 插件还是一个带解决的问题.
如何在容器中对代码进行调试
通过 VSCode 连接容器后, 就可以像在本地一样操作容器中的内容. 比如修改代码和调试代码, 下面简单介绍如何对 Python 代码进行调试, 更详细的信息请参考官方文档 Python debugging in VS Code | VSCode Docs.
首先需要在容器中安装 Python 三个 VSCode 插件
- Python
- Pylance
- Python Debugger
然后在左侧栏的 Run and Debug 栏中点击 create a launch.json file, VSCode 会自动在你当前 workspaceFolder 的根目录下创建一个 .vscode
文件夹, 其中包含一个 launch.json
文件. 我们需要在这个 launch.json
文件中写入关于 Python 调试的配置信息. 例如我的配置如下
1 | { |
然后在 Run and Debug 栏的顶部可以选择对应的配置, 点击 Start Debugging (F5) 进入调试模式.