Openpai v1.8.0部署总结

前提条件

集群内主机系统为Ubuntu 18.04 LTS server,且具有相同用户名和密码的管理员账户。

Openpai项目文档建议用Ubuntu 16.04 LTS,但是我在Ubuntu 16.04 LTS遇到了很严重的问题,所以更新到Ubuntu 18.04。

master,worker必须为物理机器,dev-box可以是硬盘空间不少于40GB的虚拟机,毕竟他只有安装和维护系统的时候才用到,用物理机器太浪费了。

注:k8s不支持swap,安装系统的时候请不要添加swap分区。

初始化

所有机器

关闭自动更新

Ubuntu 18.04 LTS server默认是开启自动更新的,需要关闭,以避免不必要的系统故障。

1
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
1
2
3
4
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";

参考:Prevent Ubuntu 18.06 And Nvidia Drivers From Updating

切换清华源

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

更新依赖

1
2
sudo apt update
sudo apt upgrade

启动BBR(可选)

拥塞控制算法,比默认的更好。

查看:

1
sudo sysctl net.ipv4.tcp_congestion_control

设置:

1
2
3
sudo bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf'
sudo bash -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
sudo sysctl -p

验证:

1
sudo sysctl net.ipv4.tcp_congestion_control

安装openssh-server

1
sudo apt install openssh-server

安装docker

https://docs.docker.com/engine/install/ubuntu/

1
sudo apt remove docker docker-engine docker.io containerd runc
1
2
3
4
5
6
7
8
sudo apt update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
1
2
3
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
1
2
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

删除添加的docker源,因为安装Openpai的时候,Openpai的脚本会再添加一次docker源,会导致源冲突。

1
sudo rm /etc/apt/sources.list.d/docker.list

安装python

按理说Ubuntu默认是有安装python的,但是我在实际操作的时候发现有的机器就是没有python,所以手动确认以下,以避免报错。

1
sudo apt install python

安装nfs客户端

1
sudo apt install nfs-common

安装压缩软件

1
sudo apt install zip

master

安装ntp

1
sudo apt install ntp

worker

安装GPU驱动

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

https://openpai.readthedocs.io/zh_CN/latest/manual/cluster-admin/installation-faqs-and-troubleshooting.html#how-to-check-whether-the-gpu-driver-is-installed

https://howtoinstall.co/en/ubuntu/xenial/xserver-xorg?action=remove

https://chrisalbon.com/code/deep_learning/setup/prevent_nvidia_drivers_from_upgrading/

1
2
3
4
5
6
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470
sudo apt autoremove xserver-xorg
sudo apt autoremove --purge xserver-xorg
sudo apt-mark hold nvidia-driver-470 # Freeze NVIDIA Drivers

安装nvidia-container-runtime

https://github.com/NVIDIA/nvidia-container-runtime#installation

https://openpai.readthedocs.io/zh_CN/latest/manual/cluster-admin/installation-faqs-and-troubleshooting.html#how-to-install-nvidia-container-runtime

先用这个命令ping一下nvidia.github.io看看返回的IP地址是否正常。

1
ping nvidia.github.io

我的网络环境这个域名已经被DNS污染了(DNS返回127.0.0.1),我的解决方案是在/etc/hosts文件中添加一行如下:

1
185.199.110.153 nvidia.github.io

然后继续安装即可

1
2
3
4
5
6
7
8
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt update
sudo apt install nvidia-container-runtime
sudo nano /etc/docker/daemon.json
1
2
3
4
5
6
7
8
9
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}

如果您局域网地址是172.*.*.*,请参考这个文档Docker-Compose导致ssh连接断开的问题,修改/etc/docker/daemon.json,否则可能出现奇怪的网络问题。即:

master节点使用

1
2
3
{
"default-address-pools": [{"base":"10.10.0.0/16","size":24}]
}

worker节点使用

1
2
3
4
5
6
7
8
9
10
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-address-pools": [{"base":"10.10.0.0/16","size":24}]
}

最后重启docker。

1
sudo systemctl restart docker

设置GPU常驻内存

https://linuxeye.com/463.html

设置GPU常驻内存,可将nvidia-smi -pm 1加入/etc/rc.local,重启生效,可解决GPU初始化缓慢、无任务运行但是利用率居高不下、偶尔丢卡等问题。

Ubuntu 18.04 LTS的rc.local逻辑已经改变了,需要自己调整一下。

  1. /lib/systemd/system/rc-local.service文件新增以下内容:
1
2
3
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
  1. 设置rc-local开机自启:
1
sudo systemctl enable rc-local
  1. /etc/rc.local中填入以下内容:
1
2
3
4
5
#!/bin/sh -e

nvidia-smi -pm 1

exit 0
  1. 赋予可执行权限:
1
sudo chmod +x /etc/rc.local

测试驱动是否正常

  1. 重启一下服务器。
1
sudo reboot
  1. 检查显卡驱动以及常驻内存是否生效
1
nvidia-smi
  1. 能正确返回信息即驱动安装成功,Persistence-M的状态为On,则常驻内存配置成功。

检查nvidia-container-runtime是否安装成功。

1
sudo docker run nvidia/cuda:10.0-base nvidia-smi

处理容器内nvidia-smi无法显示占用GPU进程问题

nvidia-smi can not detect the PID of processes using GPU

devbox

配置免密登录

  1. 生成密钥
1
ssh-keygen
  1. 向远程主机注册密钥
1
ssh-copy-id username@remote_host
  1. 测试是否可免密登录
1
ssh username@remote_host

开始安装

下面都在devbox中操作

https://openpai.readthedocs.io/en/pai-1.6.y/manual/cluster-admin/installation-guide.html

准备项目

1
2
3
git clone https://github.com/microsoft/pai.git
cd pai
git checkout v1.8.0

修改部分文件

:下面所有命令中<pai-code-dir>需要替换为您的pai项目所在路径。

修改理由在这里看:Problems of install v1.6.0

  1. 注释掉<pai-code-dir>/contrib/kubespray/quick-start-kubespray.sh#L60
1
ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml docker-cache-config-distribute.yml || exit $?
  1. <pai-code-dir>/contrib/kubespray/script/environment.sh#L50
1
sudo python3 -m pip install ansible==2.9.7

改为

1
sudo python3 -m pip install ansible==2.9.24

离线安装相关文件准备

参考:https://github.com/microsoft/pai/issues/5592

修改安装脚本

<pai-code-dir>/contrib/kubespray/quick-start-kubespray.sh

1
2
3
4
5
6
...
echo "Performing docker-cache config distribution..."
#ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml docker-cache-config-distribute.yml -e "@${CLUSTER_CONFIG}" || exit $?

echo "Starting kubernetes..."
/bin/bash script/kubernetes-boot.sh || exit $?

改为

1
2
3
4
5
6
7
8
9
...
echo "Performing docker-cache config distribution..."
#ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml docker-cache-config-distribute.yml -e "@${CLUSTER_CONFIG}" || exit $?

echo "Performing offline deploy file distribution..."
ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml offline-deploy-files-distribute.yml || exit $?

echo "Starting kubernetes..."
/bin/bash script/kubernetes-boot.sh || exit $?

即在运行script/kubernetes-boot.sh之前运行offline-deploy-files-distribute.yml

下载并保存离线文件

下载地址

Windows直接使用浏览器下载,Linux可使用下述命令下载:

1
curl https://08kytw.bn.files.1drv.com/y4mnHqJp5eDwIMFZgFBpZMdF6RZs9RLPIRZUQKyxfMxCCj5lS-NUxgM7bNstYdH-pMI0J_VgdUgssFfrcGw0mol-bjpGc0ntnKlSXz2hS-Tp3Mh68XMa_H__Trd4wDjpFkp_3VX_De6PZfpDF15z-I5nkkpY47WEzuQO97IAIqSoFYfjzmi_Uqi1Ijwzhx4we3oG1gUpuc_MSBobyot09h76A -o pai-offline-deploy-distribute.zip

  1. 解压

    1
    2
    unzip pai-offline-deploy-distribute.zip
    cd pai-offline-deploy-distribute

  2. offline-deploy-files-distribute.yml复制到<pai-code-dir>/contrib/kubespray

1
cp offline-deploy-files-distribute.yml <pai-code-dir>/contrib/kubespray
  1. roles/offline-deploy-files-distribute复制到<pai-code-dir>/contrib/kubespray/roles
1
cp -r roles/offline-deploy-files-distribute <pai-code-dir>/contrib/kubespray/roles

注意,上述文件适用于x86_64架构,其他架构的相关文件链接可在 kubespray/blob/master/roles/download/defaults/main.yml找到。

脚本所作操作如下:

  1. 加载需要的docker镜像;

  2. 这一行可知,安装的时候下载的文件会存放在/tmp/releases/文件夹,故可提前下载好相关文件以避免网络问题。

  3. 这一行可知,如果使用了skip_downloads: true参数,kubeadm默认不会在master节点安装,所以手动安装kubeadm。

编写参数文件

参考项目文档编写layout.yaml文件。

参考下面的格式编写config.yaml文件。

1
2
3
4
5
6
7
user: <your-ssh-username>
password: <your-ssh-password>
docker_image_tag: v1.8.0

openpai_kubespray_extra_var:
download_container: false
skip_downloads: true

因为我们已经下载好了相关文件,所以使用skip_downloads: true禁用下载文件相关代码,使用download_container: false禁用拉取镜像相关代码。

安装

1
2
3
cd contrib/kubespray
/bin/bash quick-start-kubespray.sh
/bin/bash quick-start-service.sh

重启服务注意事项

https://github.com/microsoft/pai/issues/5465

项目文档说管理集群要使用/pai/paictl.py,但是该文件默认checkout的是最终版本而非当前版本,所以会导致版本不一致问题。

如果要使用这个脚本的话,每次启动容器都要手动checkout一下,否则可能导致服务无法正常启动。

目前的解决方案是将本地checkout好的项目挂载到容器里面然后直接用那里面的paictl.py。

1
2
3
4
5
6
7
8
9
10
11
12
sudo docker run -itd \
-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ${HOME}/pai-deploy/cluster-cfg:/cluster-configuration \
-v ${HOME}/pai-deploy/kube:/root/.kube \
-v ${HOME}/pai:/mnt/pai \
--pid=host \
--privileged=true \
--net=host \
--name=dev-box \
--restart=always \
openpai/dev-box:v1.8.0

运行这个命令前确保${HOME}/pai中检出版本与安装版本一直,然后容器中使用/mnt/pai中的paictl.py

后续

成功启动service之后,其他个性化配置过程一般不会有问题,除非配置文件写错了,务必检查清楚。

0%