部署docker容器
K8S启动后,ascend-docker-plugin插件在K8S上完成注册,之后插件会将Device侧设备信息上报给K8S,K8S根据设备信息启动docker容器。
前提条件
配置动态库路径
容器内使用如下命令配置动态库路径(由于PDF文档格式的限制,超过单行的命令会自动换行,请将如下命令手动合成一行后再复制到服务器中执行。):
export LD_LIBRARY_PATH=/usr/local/HiAI/driver/lib64/:/usr/local/HiAI/runtime/lib64/:$LD_LIBRARY_PATH
启动K8S
ascend-docker-plugin设备分配由kubelet触发,在此之前您需要启动K8S,kubelet(K8S的组件)的代码实现可以参见kubelet代码实现。请参见kubelet代码实现本地编译kubelet,方法如下:
- 登录Atlas 300I 推理卡(型号 3000)所在服务器,并在root用户下执行以下操作。
- 进入“/home/test/source/drivers/dev_plugin/go/src/plugin/cmd/kubelet”目录,创建kubelet.go文件。
cd /home/test/source/drivers/dev_plugin/go/src/plugin/cmd/kubelet
touch kubelet.go
将kubelet代码实现中的代码复制到该文件中,根据需要修改如下代码:
allocateID := make([]string, 0) /*需要申请的设备组数,Ascend 310模式下,根据ID向plugin申请设备*/ if len(devices) > 4 { /*已经监听到的设备数大于4时*/ allocateID = append(allocateID, devices[0].ID, devices[1].ID, devices[2].ID) /*请求数组中添加前三个设备ID*/ } else if len(devices) == 4 { /*已经监听到的设备数等于4时*/ allocateID = append(allocateID, devices[0].ID, devices[1].ID) /*请求数组中添加前两个设备ID*/ } else { /*已经监听到的设备数小于4时*/ allocateID = append(allocateID, devices[0].ID) /*请求数组中添加第一个设备ID*/ }
- 监听到的设备数:Kubelet发现的ascend-docker-plugin上报的设备数。
- 请求数组中添加的设备:启动插件之后,容器中可以正常使用的设备(可以通过ls /dev/ | grep davinci*命令查看容器中可以使用的设备)。
- 请求数组中添加的设备≤监听到的设备数。
修改完成后,执行如下命令(注:只有一条命令,go build前面有空格;由于PDF文档格式的限制,超过单行的命令会自动换行,请将如下命令手动合成一行后再复制到服务器中执行。)
GOPATH=/home/test/source/drivers/dev_plugin/go/:/home/test/source/third_party/go/ go build .
如果没有kubelet目录,请手动创建。
- 编译完成后,会生成kubelet可执行文件。
kubelet路径为:“/home/test/source/drivers/dev_plugin/go/src/plugin/cmd/kubelet”
- 编译完成之后,执行如下步骤,运行kubelet:
- 创建目录,命令为:mkdir /tmp/hiai_plugin_test 。
hiai_plugin_test请根据实际情况进行修改。
- 运行kubelet,命令为:./kubelet &
- 创建目录,命令为:mkdir /tmp/hiai_plugin_test 。
启动插件
参见ascend-docker-plugin插件编译得到容器插件ascend-docker-plugin,执行如下命令启动插件(如下为一条命令,由于PDF文档格式的限制,超过单行的命令会自动换行,请将如下命令手动合成一行后再复制到服务器中执行):
cd /home/test/source/drivers/dev_plugin/go/src/plugin/cmd/ascend-docker-plugin
./ascend-docker-plugin -mode=ascend310 -plugin-directory=/tmp/hiai_plugin_test &
命令执行后,将启动一个后台进程,该进程与Kubernetes(简称K8S)的Kubelet交互,用于将插件注册到Kubernetes上,命令详细使用以及参数说明请参见插件运行示例,执行结果请参见图7-7。
Kubelet为K8S的组件,用于发现ascend-docker-plugin上报的设备,并将发现的设备上报给K8S。
运行完毕后,会返回一系列的参数,例如图7-7,其中“AllocateResponse”即为返回的所有参数信息,“/dev/davinci0”即为插件要上报的设备信息。
同时会在“/var/dlog”目录下生成日志文件,如图7-8中的/var/dlog/docker/device-0_2019-04-23-14-39-53.746。
可以将该文件导入Mind Studio中,查看详细日志信息,日志导入方法请参见《Ascend 310 Mind Studio开发辅助工具》中的日志导入章节。
启动容器
本节给出启动容器以及容器启动后添加HwHiAiUser用户的方法。
- 登录Atlas 300I 推理卡(型号 3000)所在服务器,并在root用户下执行以下操作。
- 查看宿主机host侧HwHiAiUser的gid,使用命令为:
id HwHiAiUser
- 启动容器。
- K8S将启动插件中生成的设备参数列表(Devices列表中指明的设备,如:/dev/davinci0)和dlog目录映射到容器内,用于启动容器,启动命令为:
docker run -it --net=host \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/davinci0 \
-v /usr/local/HiAI/:/usr/local/HiAI/ \
-v /etc/slog.conf:/etc/slog.conf \
-v /usr/local/sbin:/usr/local/sbin \
-v /var/dlog/docker/device-0_2019-04-23-14-39-53.746:/var/dlog \
ubuntu:latest /bin/bash
参数说明如下:
- --net:表示网络映射
- --device:表示设备映射
- -v:表示路径映射
- ubuntu:表示启动的docker镜像
命令执行情况请参见图7-10。 - 容器启动后,执行以下命令查看当前docker容器中可以使用的davinci设备:
ls /dev/ | grep davinci*
命令执行情况参见图7-11。
其中:
- davinci_manager为管理模块的字符设备节点。
- davinci0为该容器使用的davinci设备。
如果启动了slogd,则在宿主机的/var/dlog/docker/device-0_2019-04-23-14-39-53.746目录可以看到日志。
- K8S将启动插件中生成的设备参数列表(Devices列表中指明的设备,如:/dev/davinci0)和dlog目录映射到容器内,用于启动容器,启动命令为:
- 在容器内部创建普通用户HwHiAiUser,并设置该用户的群组以及$HOME目录,命令为(由于PDF文档格式的限制,超过单行的命令会自动换行,请将如下命令手动合成一行后再复制到服务器中执行):
groupadd -g gid HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok
请将上述命令中的gid替换为2中查出的gid值。例如图7-9查询的gid为1000,则此处命令实际为:
groupadd -g 1000 HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok
命令执行如图7-12所示。
上述gid=1000只是样例,请以实际环境查询出的host侧HwHiAiUser的gid为准。