CubeAI智立方——AI服务原生平台(集成版)
CubeAI智立方是一套集AI模型自动化服务封装、发布、共享、部署和能力开放等功能于一体的开源AI服务原生平台和工具集,其核心作用在于打通AI模型开发至实际生产应用之间的壁垒,加速AI创新和应用进程,促进AI应用从设计、开发直到部署、运营整个生命周期的自动化快速迭代和演进。
CubeAI智立方开源软件由一系列基础开发工具、平台应用微服务和模型样例程库等软件组成,详见: CubeAI智立方 。
本代码仓库是CubeAI智立方平台的单体集成版,与 微服务版 相比,部署和使用较为方便。
开发和部署环境
操作系统
- Linux Ubuntu 16.04 LTS以上,建议Ubuntu 20.04 LTS
开发语言
后端
Python 3.7 以上
前端
-
Node.js
- 以root身份登录,从 https://nodejs.org/en/download/ 下载node(建议版本号:v15.1.0),拷贝至 /opt 目录。
# cd /opt
# wget https://nodejs.org/download/release/v15.1.0/node-v15.1.0-linux-x64.tar.xz
- 解压,创建符号连接以便可以调用:
# tar -xvf node-v15.1.0-linux-x64.tar.xz
# ln -s node-v15.1.0-linux-x64 nodejs
# ln -s /opt/nodejs/bin/node /usr/bin/node
# ln -s /opt/nodejs/bin/npm /usr/bin/npm
# ln -s /opt/nodejs/bin/npx /usr/bin/npx
# node -v
# npm -v
- 配置npm源国内镜像:
# npm config set registry https://registry.npm.taobao.org
# npm config get registry
-
Angular CLI
- 安装
# npm install -g @angular/cli@10.1.1
- 创建符号链接以便可以调用
# ln -s /opt/nodejs/bin/ng /usr/bin/ng
# ng --version
集成开发环境
建议: PyCharm
GPU支持
如果本机配有NVIDIA GPU显卡,可通过一下步骤来安装配置相应的GPU开发环境:
-
安装NVIDIA显卡驱动
执行 nvidia-smi 命令验证NVIDIA显卡驱动是否正常安装:
$ nvidia-smi
-
安装CUDA Toolkit
-
下载并安装CUDA Toolkit,建议使用10.2版本:
$ wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run
$ sudo sh cuda_10.2.89_440.33.01_linux.run
-
创建符号链接,便于快捷访问:
$ sudo ln -s /usr/local/cuda-10.2 /usr/local/cuda
-
更新系统环境变量
编辑 /etc/profile 文件,在其末尾追加如下几行内容:
export CUDA_HOME=/usr/local/cuda
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
然后重启系统。
-
查看CUDA安装情况及版本号:
$ nvcc -V
-
安装cuDNN(CUDA的深度学习加速库)
-
从 https://developer.nvidia.com/rdp/cudnn-download 网站选择下载相应版本的cuDNN,例如:cudnn-9.2-linux-x64-v7.6.5.32.tgz
-
解压cudnn文件,并执行如下操作:
$ tar -xvf cudnn-9.2-linux-x64-v7.6.5.32.tgz
$ cd cudnn-9.2-linux-x64-v7.6.5.32
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
容器化支持
Docker
-
安装Docker引擎,方法和步骤参见: https://docs.docker.com/engine/install/ubuntu/ 或 https://developer.aliyun.com/mirror/docker-ce。
-
使用非root用户登录,配置其具有操作docker的权限:
$ sudo usermod -aG docker $USER
$ newgrp docker
-
配置Docker引擎相关参数:
- 在 /etc/docker/daemon.json 文件(如没有则创建)中添加如下内容:
{
"registry-mirrors": [
"https://mirror.baidubce.com/"
],
"live-restore": true,
insecure-registries": ["<本机网卡IP地址(例如:192.168.1.2)>", "<本机网卡IP地址(例如:192.168.1.2)>:8001"]
}
- 开启本机docker服务的2375端口(在minikube集群环境中部署CubeAI情况下,模型打包时需要访问集群外部的宿主机docker服务):
在 /etc/systemd/system/docker.service.d/override.conf文件(如果没有则创建)中添加如下几行内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
- 如果本机配有NVIDIA GPU显卡,需要执行以下命令来安装NVIDIA容器运行时:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-docker2 conntrack ebtables ethtool socat
并在Docker引擎配置参数中添加NVIDIA容器运行时相关参数:
在 /etc/docker/daemon.json 文件中添加如下内容:
{
"registry-mirrors": [
"https://mirror.baidubce.com/"
],
"live-restore": true,
"insecure-registries": ["<本机网卡IP地址>", "<本机网卡IP地址>:8001“],
"exec-opts": ["native.cgroupdriver=systemd"],
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
- 然后执行如下命令重启Docker引擎:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
docker-compose
建议尽量安装docker-compose最新版(1.29以上):
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose
云原生支持
在开发环境中建议使用minikube来搭建单节点k8s集群,用于部署和运行AI模型,以及将CubeAI平台自身部署至k8s集群。
Minikube官方文档参见:https://minikube.sigs.k8s.io/docs/ 。
建议使用 minikube v1.25.2 版本,集群搭建步骤如下:
-
如果使用 Ubuntu 16.4 ,需在每次重启系统后执行如下操作(Ubuntu 18.4/20.4 不需要):
修改 /etc/resolv.conf 文件:
将其中 “nameserver 127.0.x.x” 改为: “nameserver 114.114.114.114”
-
使用非root用户登录,配置其具有操作docker的权限:
$ sudo usermod -aG docker $USER
$ newgrp docker
-
安装kubectl:
$ curl -LO “https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl”
$ sudo install kubectl /usr/local/bin/kubectl
-
配置HostPath Volume持久化:
$ sudo sysctl fs.protected_regular=0
$ sudo mkdir -p /var/tmp/hostpath-provisioner /tmp/hostpath-provisioner
$ sudo mount --bind /var/tmp/hostpath-provisioner /tmp/hostpath-provisioner
$ echo '/var/tmp/hostpath-provisioner /tmp/hostpath-provisioner none defaults,bind 0 0' |sudo tee -a /etc/fstab
-
拉取minikube依赖的镜像:
$ docker pull registry.aliyuncs.com/google_containers/storage-provisioner:v5
$ docker tag registry.aliyuncs.com/google_containers/storage-provisioner:v5 registry.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5
-
安装minikube:
$ curl -LO https://storage.googleapis.com/minikube/releases/v1.25.2/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
-
启动minikube:
如果以前启动过其他版本的minikube,需要先清除相关痕迹:
$ minikube delete --all
$ minikube delete
$ sudo rm -rf .kube/
$ sudo rm -rf .minikube/
$ sudo rm -rf /etc/kubernetes/
$ sudo rm /tmp/juju*
$ sudo rm /tmp/minikube*
$ sudo rm -rf /var/lib/minikube/
然后执行如下命令其中minikube:
$ sudo -E minikube start --driver=none --image-mirror-country=cn --image-repository=registry.aliyuncs.com/google_containers --insecure-registry "192.168.1.1" --install-addons false --extra-config=kubelet.cgroup-driver=systemd
注意,上述 --insecure-registry 参数值需要替换成本机网卡的IP地址或地址段,例如192.168.1.x或192.168.1.0/24,请根据实际情况修改。
启动过程中如果出现如下提示:
Exiting due to INET_DOWNLOAD_TIMEOUT: updating control plane: downloading binaries: downloading kubeadm: download failed: https://storage.googleapis.com
可在 /etc/hosts 中加入如下一行试试:
172.217.160.112 storage.googleapis.com
等待显示:Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default,表示集群启动完毕。然后执行:
$ sudo chown -R $USER $HOME/.kube $HOME/.minikube
-
如果需要在k8s中使用GPU,可通过执行以下命令来配置gpushare(需先克隆下载本仓库代码):
$ sh ~/cubeai_allinone/deploy/minikube/gpushare/deploy_gpushare.sh
-
配置metrics-server(可选):
$ kubectl apply -f ~/cubenet/cubeai_deploy/minikube/plugin_metrics
$ kubectl -nkube-system patch deploy metrics-server --patch '{"spec":{"template":{"spec":{"containers":[{"name":"metrics-server","args":["--cert-dir=/tmp","--secure-port=4443","--kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP","--kubelet-use-node-status-port","--metric-resolution=15s","--kubelet-insecure-tls"]}]}}}}'
-
配置dashboard:
$ minikube addons enable dashboard --images="Dashboard=dashboard:v2.5.1,MetricsScraper=metrics-scraper:v1.0.7"
-
配置远程连接权限,以使CubeAI平台可远程连接此集群:
$ kubectl -nkube-system create sa remote-admin
$ kubectl create clusterrolebinding remote-admin --clusterrole=cluster-admin --serviceaccount=kube-system:remote-admin
-
安装Istio:
$ wget https://github.com/istio/istio/releases/download/1.13.2/istio-1.13.2-linux-amd64.tar.gz --no-check-certificate
$ tar -xvf istio-1.13.2-linux-amd64.tar.gz
$ ./istio-1.13.2/bin/istioctl install --set hub=mirror.baidubce.com/istio -y
$ kubectl -nistio-system patch svc istio-ingressgateway --patch '{"spec":{"externalIPs":["'"$(minikube ip)"'"],"ports":[{"name":"nexus-ui","port":8081,"protocol":"TCP","targetPort":8081}]}}'
-
创建CubeAI项目命名空间:
$ kubectl create namespace cubeai
$ kubectl label namespace cubeai istio-injection=enabled
-
启动dashboard界面:
$ minikube dashboard
等待显示Opening http://127.0.0.1:3xxxx/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...,命令会自动调用浏览器打开dashboard。
如果未自动打开浏览器,请将上述URL复制到浏览器打开。
-
停止minkube:
$ minikube stop
-
重启minikube集群:
$ sudo -E minikube start
$ sudo chown -R $USER $HOME/.kube $HOME/.minikube
-
彻底删除minkube集群:
$ minikube delete --all
平台开发
代码下载
-
在当前用户主目录下克隆本代码仓库:
$ cd
$ git clone https://openi.pcl.ac.cn/cubeai/cubeai_allinone.git
运行/调试/二次开发
-
拉起平台运行需要的依赖dockers:
打开一个terminal窗口,运行:
$ cd ~/cubeai_allinone/deploy
$ sudo docker-compose -f docker-compose-dev.yml up
-
在集成开发环境(例如Pycharm)中分别打开本代码仓库目录,运行 start.py 。
-
在浏览器中打开: http://127.0.0.1:8080,进行初始化配置:
- 初次运行,以admin/admin身份登录,按照提示修改damin用户密码。
- 进入"系统管理|配置管理"页面,按照实际情况修改其中所有配置项。
- 进入"系统管理|用户管理"页面,新建一个管理员账号,赋予所有角色。
- 退出admin账号,以新建管理员账号登录。
-
添加用于访问CubeAI各子平台的应用链接
进入“系统管理|应用管理”页面,创建若干新应用:
- 应用名称: AI模型共享
- URL: /modelhub
- 主题1: 平台导航
- 主题2: homepage
- 所需角色:
- 应用名称: AI能力开放
- URL: /deployment
- 主题1: 平台导航
- 主题2: homepage
- 所需角色:
- 应用名称: 个人中心
- URL: /myinfo
- 主题1: 平台导航
- 主题2: homepage
- 所需角色: ROLE_USER
- 应用名称: 系统管理
- URL: /admin
- 主题1: 平台导航
- 主题2: homepage
- 所需角色: ROLE_ADMIN
-
刷新页面,试用CubeAI平台各功能。
部署
docker-compose部署
-
打包Docker镜像
$ cd ~/cubeai_allinone
$ sh build-dockers.sh
-
拉起并运行所有docker:
$ cd ~/cubeai_allinone/deploy
$ sudo docker-compose -f docker-compose-prod.yml up
-
在浏览器中打开:
http://127.0.0.1:8080
-
运行结束后,停止并删除所有docker容器:
$ sudo docker-compose -f docker-compose-prod.yml down
minikube部署
-
打包Docker镜像
$ cd ~/cubeai_allinone
$ sh build-dockers.sh
-
修改配置参数
修改 ~/cubeai_allinone/deploy/minikube/service/ingressgateway.yml文件,将其中所有IP地址替换为本机IP地址。
-
拉起CubeAI平台运行需要用到的存储资源:
$ kubectl apply -f ~/cubeai_allinone/deploy/minikube/storage
-
拉起CubeAI平台服务:
$ kubectl apply -f ~/cubeai_allinone/deploy/minikube/service
-
在浏览器中输入如下地址打开CubeAI平台页面:
http://<命令 minikube ip 的输出值>
-
运行结束后,停止并删除CubeAI服务:
$ kubectl delete -f ~/cubeai_allinone/deploy/minikube/service