之前写过一个OpenPAI部署记录,最近试着重装了下目前最新的v0.11,发现变化还是挺大的,原来的内容很多地方都不再适用,在这里做个记录以便备忘。
环境准备
- 一组集群主机,PC或服务器均可,其中包括多台worker节点和一台master节点,worker节点要求具有NVIDIA GPU,当然没有也可以,只是对于深度学习来说没有意义。master节点可以没有gpu
- 一台独立于集群的主机,用于进行部署和管理维护,这里称为“维护机”
- 所有节点全新安装Ubuntu Server 16.04,不要安装GPU驱动及CUDA
- 各节点具有统一的登录账户及密码,此账户不需要root账户角色,但必须具有sudo权限
- 各节点拥有固定的IP地址
- 各节点均可访问互联网
- 各节点间可互访
- 各节点ntp功能可用
部署过程
安装docker-ce
以下操作在每个节点上都要执行,包括额外的集群管理终端
- 安装支撑包
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
2. 增加docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
3. 验证key生效
sudo apt-key fingerprint 0EBFCD88
正常应显示类似以下形式的内容
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
4. 增加源
sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
5. 安装docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
6. docker安装成功验证
sudo docker run hello-world
显示“Hello from Docker!”等信息即说明安装成功
部署
- 在维护机中安装dev-box镜像
sudo docker pull docker.io/openpai/dev-box:v0.11.0
2. 启动dev-box容器
sudo docker run -itd
-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM
-v /var/run/docker.sock:/var/run/docker.sock
-v /pathConfiguration:/cluster-configuration
-v /hadoop-binary:/hadoop-binary
--pid=host
--privileged=true
--net=host
--name=dev-box
docker.io/openpai/dev-box:v0.11.0
3. 登入dev-box
sudo docker exec -it dev-box /bin/bash
以下操作均在dev-box中进行
4. 编辑quick-start配置文件
cd /pai/deployment/quick-start
cp quick-start-example.yaml quick-start.yaml
vi quick-start.yaml
quick-start.yaml主要需要修改的内容如下
machines:
- <ip-of-master>
- <ip-of-worker1>
- <ip-of-worder2>
- ...
ssh-username: <username>
ssh-password: <password>
- "machines"块记录了集群所有节点的ip,将改为master节点的ip,将所有worker节点的ip一次替换到每个中
- 将字段替换为每个节点的通用登录用户名
- 为对应的登录密码 修改完成后保存
5. 生成OpenPAI配置文件
cd /pai
python paictl.py config generate -i /pai/deployment/quick-start/quick-start.yaml -o ~/pai-config -f
6. 设置节点配置信息layout.yaml
vi ~/pai-config/layout.yaml
此文件用于配置每个集群节点的硬件配置,包括gpu数量、型号、cpu核数、内存容量,操作系统等。内容示例如下:
machine-sku:
GENERIC:
mem: 1
gpu:
type: generic
count: 1
cpu:
vcore: 1
os: ubuntu16.04
DELL:
mem: 64
gpu:
type: generic
count: 1
cpu:
vcore: 6
os: ubuntu16.04
LENOVO:
mem: 256
gpu:
type: generic
count: 1
cpu:
vcore: 12
os: ubuntu16.04
machine-list:
- dashboard: "true"
docker-data: "/var/lib/docker"
etcdid: "etcdid1"
hostip: "192.168.11.202"
hostname: "openpai-node2"
k8s-role: "master"
machine-type: "LENOVO"
nodename: "192.168.11.202"
pai-master: "true"
password: "123456"
ssh-port: "22"
username: "openpai"
zkid: "1"
- docker-data: "/var/lib/docker"
hostip: "192.168.11.201"
hostname: "openpai-node1"
k8s-role: "worker"
machine-type: "DELL"
nodename: "192.168.11.201"
pai-worker: "true"
password: "123456"
ssh-port: "22"
username: "openpai"
文件主要包括两个部分:“machine-sku”和“machine-list”。 machine-sku:机型配置,记录若干配置的机型名,如上例中存在GENERIC、DELL、LENOVO三个配置名称,按自己实际情况修改配置即可。 machine-list:主要将每个节点中“machine-type”的值修改为对应的在machine-sku配置好的配置名称,其他字段已经自动赋好值了不需要修改。
7. 编辑kubernetes-configuration.yaml
该文件是k8s基础配置文件,主要指定了一些组件版本之类信息,正常情况下不需修改。但是该配置文件下后续k8s安装将使用http://gcr.io下载docker镜像,在国内使用不便,因此我们需要在此处更改docker源。
vi ~/pai-config/kubernetes-configuration.yaml
将文件中“docker-registry”字段做以下修改:
docker-registry: docker.io/openpai
这样将把k8s下载源改为openpai维护的http://docker.io源,暂时不受功夫网影响。
8. 编辑services-configuration.yaml
vi ~/pai-config/services-configuration.yaml
首先需要指定存储路径,主要包括hdfs和其他服务数据的存储路径。首先解除文件开头"common"和"data-path"两个字段的注释,并给data-path赋值到真实位置:
cluster:
common:
# cluster-id: pai-example
#
# # HDFS, zookeeper data path on your cluster machine.
data-path: "/data"
按照官方教程,下面需要在在给"docker-tag"字段赋值为"v0.11.0",但是当你改到这里的时候会发现根本没有这个字段,反而有一个"tag"字段并且已经被赋好v0.11.0了,但是不管怎么样为了避免这里没做导致后面出问题,手动加一个吧:
# the docker registry to store docker images that contain system services like frameworklauncher, hadoop, etc.
docker-registry:
# The namespace in your registry. If the registry is docker.io, the namespace will be your user account.
namespace: openpai
# E.g., gcr.io.
# if the registry is hub.docker, please fill this value with docker.io
domain: docker.io
# If the docker registry doesn't require authentication, please comment username and password
#username: <username>
#password: <password>
tag: v0.11.0
docker-tag: v0.11.0
# The name of the secret in kubernetes will be created in your cluster
# Must be lower case, e.g., regsecret.
secret-name: pai-secret
之后可以指定显卡驱动版本,不指定的话默认安装384.111,这个驱动对于图灵核心显卡是不支持的,所以如果你用的是新显卡,就需要手动指定显卡版本,如果用的pascal架构或者更早的卡就无所谓了。
找到"drivers"字段,解除drivers、set-nvidia-runtime、version三个字段的注释,需要注意驱动版本只能从注释里的版本里面选择:
drivers:
set-nvidia-runtime: false
# You can set drivers version here. If this value is miss, default value will be 384.111
# Current supported version list
# 384.111
# 390.25
# 410.73
version: "410.73"
9. 安装启动k8s服务
cd /pai
python paictl.py cluster k8s-bootup -p ~/pai-config
待脚本执行结束后,打开”http://master-ip:9090“ 检查k8s服务启动状态
10. 推送配置 待k8s部署完成,输入以下命令推送配置:
cd /pai
python paictl.py config push -p ~/pai-config
执行以上命令后需要询问设置cluster-id,自己随便输一串东西就行了,但是要记住,后面会用到。
11. 启动OpenPAI服务
cd /pai
python paictl.py service start
输入该命令后就会询问前面设置的cluster-id。
其他操作
- 关闭OpenPAI服务
登录dev-box,输入以下命令:
cd /pai
python paictl.py service stop
按提示输入cluster-id即可。
2. Linux内核兼容问题
发现将系统内核更新到4.4.0-148之后,显卡驱动镜像就开始报错了,包括最新的410.73版本。
目前官方的解决方法是在部署之前修改"/pai/src/drivers/deploy/drivers.yaml.template"文件,将第35行:
image: {{ cluster_cfg["cluster"]["docker-registry"]["prefix"] }}drivers-{{ cluster_cfg["drivers"]["version"] }}:{{ cluster_cfg["cluster"]["docker-registry"]["tag"] }}
修改为:
image: docker.io/openpai/drivers-418.30:v0.11.0
这个操作在目前最新的12.0上也完全,特别是后面的版本号不要变,保持11.0