Code-Server——AI中台云端IDE的部署实践
admin
2023-08-07 08:40:08
0

一. 简介

Code-Server 是一个可以在远程服务器(Ubuntu、Centos)上运行微软VS Code 的工具,可以在浏览器进行访问,来达到近乎本地的体验效果。相比目前主流AI中台中常见的jupyter notebook的线上编程解决方案(仅比较适用于数据分析任务,对大型的NLP、CV任务开发效率低),可以在Code-Server中体验到【在线调试、代码自动补全、丰富插件、代码跟踪】等本地IDE的功能,非常好用。

可惜的是目前仅被大家用来作为个人的线上编码工具,尚未集成到系统中。本文将探究将Code-Server集成为Docker,后续可以作为镜像和容器,结合深度学习框架,作为AI中台系统对notebook的代替。优势如下:

  1. 我们可以通过浏览器,随时随地利用到强大的服务器GPU资源,更快的完成对SOTA任务的复现。
  2. 结合AI中台里K8s、Rancher等镜像和容器调度技术,可以将常用的环境一键制作,多处(开发、训练、部署)迁移复用。
  3. 云的魅力,很爽,亲测3个月了,回不去了。

二. 安装和运行

2.1 教程资料收集

这个部分主要介绍如何下载并在服务器中进行安装运行,步骤较为简单,可以按我这里的步骤,也可以按如下链接的视频或资料去安装,百花齐放,这部分很成熟了。具体的差异和报错要看自己的服务器了,ubuntu和centos下命令稍有差异。

2.2 服务器下载安装

我安装的系统基于Ubuntu 16.04.7 LTS,已经安装了显卡驱动、cuda10、cudnn7等。下面直接上shell命令代码,十分简单完成部署安装。

# 下载
# 1.官方最新版本:https://github.com/coder/code-server/releases
# 2.历史版本:3.4.1
wget https://github.com/cdr/code-server/releases/download/3.4.1/code-server-3.4.1-linux-x86_64.tar.gz

# 解压
tar -zxvf code-server-3.4.1-linux-x86_64.tar.gz
cd code-server-4.0.1-linux-amd64/

# 查看端口占用情况
netstat -nultp # 所有端口
netstat -anp |grep 8080 # 特定端口

# 启动,默认使用8080端口,可以自己设置为8950等空闲端口
export PASSWORD="123456a@" && ./code-server --host 0.0.0.0 --port 8080
export PASSWORD="123456a@" && ./code-server --host 0.0.0.0 --port 8950

# 在浏览器访问
http://自己的服务器IP地址:8080/

成功标志:




服务器成功界面



浏览器成功启动界面

2.3 配置及插件改进

完成上面是第一步,但是要实现在上面debug、训练深度学习模型,还需要进行插件下载和功能配置。分为以下几个方面:

  1. 修改为中文、后台运行:
    需要配合Screen来使用,避免断开服务器SSH链接后,任务断开。直接上步骤:
1. 修改中文——直接在浏览器中操作
(1)快捷键Ctrl+shift+p,输入configure display language
(2)点击安装额外的语言,安装中文。
(3)安装完后,用(1)的命令,选择zh-cn,最后点击提示框重启即可。

2. 后台运行——需要在服务器重新启动
(1)安装screen
apt-get -y install screen # ubuntu
yum -y install screen # centos

(2)安装完成后新建一个窗口,此命令创建一个名为codeserver的窗口并进入
screen -S codeserver

(3)运行code-server
export PASSWORD="123456a@" && ./code-server --host 0.0.0.0 --port 8950

(4)查看窗口:screen -ls
退出窗口(暂时分离进入linux):在screen窗口中,同时按ctrl+a+d;或screen -d 窗口名或窗口ID
恢复会话:screen -r 窗口名或窗口ID
关闭窗口:kill -9 窗口ID


2. 安装插件

在浏览器的code-server界面中快捷键Ctrl+shift+X,或左边栏的【扩展】处,搜索并安装python、scala、maven等,后续可进行运行和调试。

3. 安装git并使用git clone(服务器已安装可忽略)

# 更新依赖包
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update

# 安装git
sudo apt-get install git

# 检验安装成功
git --version
(git version 2.7.4)

# 使用git直接下载项目
git clone https://github.com/Coder-Liuu/TopoMAD.git

4. 服务器安装anconda3-5.2.0版本,source ~/.bashrc

# 下载后放到服务器上:https://repo.anaconda.com/archive/
bash Anaconda3-5.2.0-Linux-x86_64.sh
source ~/.bashrc

# 更换pip源为douban
# 方法一:
pip install -r requirements.txt -i https://pypi.douban.com/simple
# 方法二:(推荐)
cd ~/.pip
# 报错则新增
mkdir ~/.pip
vim pip.conf

# 添加:
# 清华源:index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[global]
index-url = https://pypi.douban.com/simple

5. 设置默认的python版本

(1)使用快捷键 Ctrl+Shift+P 打开命令窗口

(2)选择 “Python: Select Interpreter”,弹窗显示现有的 Python 版本

# 在vscode界面的左下角,点击三角感叹号,就能调用终端进行python依赖包的安装
pip install tensorflow-gpu==1.15.0 --ignore-installed wrapt

# 测试
python
import tensorflow as tf
# 1.x版本
tf.test.is_gpu_available()
# 2.x版本
tf.config.list_physical_devices('GPU')

# 查看运行中的程序
# ps aux | less
ps aux | grep python
kill -9 进程ID

# 使用tensorboard
tensorboard --logdir models/output_couplet/
运行成功后访问,例如下,具体参照运行结果的端口:
http://自己的服务器IP:6006/#scalars

6.【最重要步骤】VScode如何Debug(调试)进入标准库文件/第三方包源码

在使用vscode进行代码调试的时候,往往默认只能进入用户自己编写的文件中,这是因为默认的设置导致,我们只需要按照下图添加justMyCode参数,设置为false即可。每次需要选择这个文件然后点击左边的播放符号。




进入第三方库调试的配置文件

2.4 训练实战

这次训练一个albert的文本分类模型,顺利使用GPU资源,顺利进行调试,同时可以使用tensorboard来查看训练过程loss和评估指标的变化。




启动训练



设置断点进入调试



使用tensorboard查看训练过程

三. 探索集成Docker

上面的安装使用存在一个弊端,就是当组内其他成员想要使用,或者换一个pyhton版本、tensorflow、pytorch版本的时候比较麻烦且冲突。为了解决这些问题,我们需要使用到docker容器技术(具体的解释可参考往期博文:Docker-制作本地深度学习镜像&flask服务发布),结合K8s或Rancher对镜像和容器的统一调度,实现每一个镜像(Image)代表一套独立的深度学习/机器学习项目环境。

这样每个成员需要使用自己的环境时,只需要在AI系统中,创建一个容器(Container),挂载上所需的镜像、资源(CPU核数、内存大小、GPU卡数、显存大小等)、文件路径,即可实现每个独立项目的快速编程,不用重新构建一个python环境。

当然以上是一整套复杂的系统支撑,那么要实现的最基础的一步,就是构建一个包含code-server的通用镜像,这样可以通过docker hub pull下来到任意服务器、任意K8s调度系统中使用。

3.1 code-server的docker安装

查询发现,code-server是有docker版本的,而且部署方式也很容易,直接上代码

# 使用最后一行无需直接以下的拉取命令
docker pull codercom/code-server:4.0.1
docker pull codercom/code-server:latest

# ubuntu16.04环境下
# 安装docker并运行:http://www.xiaoheidiannao.com/226858.html
apt install docker.io
# centos
curl -sSL https://get.daocloud.io/docker | sh

# 进入窗口
screen -S codeserver
docker run -p 31006:8080 --name code -v "/root/Joven/project/:/home/coder/project" -e PASSWORD="123456a@" codercom/code-server:4.0.1

但是我们还需要在上面安装上合适我们自己服务器的显卡驱动,python环境、cuda加速等,就比较麻烦了。而且我们还想让这个docker可以直接集成到AI中台系统中,那就需要去掉密码,且支持一键(一个命令)部署,于是就有了几天的安装探索,期间尝试了很多组合方式,踩了不少坑。

那大家直接根据下面命令安装就好,还是基于Ubuntu 16.04.7 LTS,centos的命令稍有改动,但是制作完成的docker可以任意迁移到相同配置的服务器中。

3.2 实现集成cuda10、cudnn7、codeserver的镜像

  1. 使用tensorflow-gpu 1.15.0的基础镜像,包含cuda10,cudnn7等。同时定义端口映射:31006代表8080端口
docker run -it --ipc=host -p 31005:22 -p 31006:8080 --restart=always --name code-server --privileged=true -h code-server guaimaro/tensorflow-gpu-1.15 /sbin/init

2. 进入容器中,安装显卡驱动、code-server等

# 复制驱动及测试文件进入镜像中
docker ps -a
docker cp /usr/src/cudnn_samples_v7/conv_sample cbc8df93cb1c:/usr/src/cudnn_samples_v7/
docker cp /root/software/NVIDIA-Linux-x86_64-410.129-diagnostic.run cbc8df93cb1c:/home/
# 进入镜像安装验证
docker exec -it code-server /bin/bash
cd /home/
# 安装驱动
apt-get update
apt-get install kmod
sh NVIDIA-Linux-x86_64-410.129-diagnostic.run -a -N --ui=none --no-kernel-module
nvidia-smi
# 安装code-server
# 安装必要包
apt-get update
apt-get install -y gcc vim make kmod sudo g++
wget https://github.com/cdr/code-server/releases/download/v4.0.1/code-server_4.0.1_amd64.deb
dpkg -i code-server_4.0.1_amd64.deb
apt-get install --reinstall systemd
systemctl enable --now code-server@root
# 输出
Created symlink /etc/systemd/system/default.target.wants/code-server@root.service → /usr/lib/systemd/system/code-server@.service.
System has not been booted with systemd as init system (PID 1). Can't operate.

3. 将容器提取为暂时的镜像

docker commit 容器ID jovenchu/code2:base

4. 创建DockerFile,定义指定的挂载目录、免密登录、中文、服务端口等信息,支持一键启动

FROM jovenchu/code2:base
RUN apt-get install sudo
WORKDIR /home/coder/project
# RUN systemctl restart code-server@root
# 容器启动code-server:指定插件目录,指定中文,指定免密登录
ENTRYPOINT ["code-server","--locale","zh-cn","--host","0.0.0.0","--port","8950", "--user-data-dir", "/home/coder","--auth","none"]

5. 运行命令构建docker

# 构建最终镜像
cd /root/Joven/project/7
docker build -t jovenchu/auto-codeserver:1.0.0 .

6. 一键启动。安装python什么的直接在网页就可以,设置完了就可以固化镜像并上传

# 和code-server融合,两者均为基础镜像,不能合并,对code-server逆向(https://blog.csdn.net/weixin_33859504/article/details/86345078)
# 运行镜像并挂载文件目录
# 支持中文、深色背景、安装python的版本,其中的端口映射:8950为网页端口、6006、6007分别为tensorboard端口,5000为服务端口
docker run -it --ipc=host -p 31065:8950 -p 31066:6006 -p 31067:6007 -p 31068:5000 -v "/root/Joven/project/:/home/coder/project/" --restart=always --name code-auto --privileged=true -h code-server jovenchu/auto-codeserver:1.0.1 /sbin/init

# 固化镜像
docker commit code-auto jovenchu/auto-codeserver:1.0.1
# 上传到docker hub
docker push jovenchu/auto-codeserver:1.0.1
##导出镜像
docker save jovenchu/auto-codeserver:1.0.1 > code-auto-1.0.1.tar

7. 说明:因为code-server的docker和tensorflow-gpu 1.15.0的docker都是基础镜像,不能通过dockerfile合并。而且在code-server中安装cuda什么的没办法一键加载,只能通过这种方式进行了。

四. 总结

不得不说,云端IDE真的用的很爽,浏览器就能编程和训练模型,用了之后直接抛弃Pycharm。甚至在IPad上,在APP store下载Servediter,结合Blink链接服务器使用,也能达到电脑的效果(当然12.9寸的体验更好)。

最后附上我制作的code-server镜像,适配V100的GPU,其他的大家更换驱动就行~改完固化一下就好,希望能帮助大家飞快编码,顺畅训练模型~

但愿AI中台真的好用吧~

相关内容