在Azure Machine Learning中使用搭载Azure Arc的GPU的Kubernetes(1)Kubernetes配置部分
首先
由於 Azure Advent Calender 2022 的第10天的日程尚未被安排,所以我填入了空缺的位置。
今年秋季的时候,我组装了一台搭载了NVIDIA GPU的自制电脑。
尽管我制作了一些东西,但它并没有特别的用途,只是闲置着。我突发奇想,想要将这台机器充分利用起来,将其作为Azure机器学习的计算资源来使用。本文记录了这个设置的历史。
环境
硬件规格如下所示。
-
- CPU: Core(TM) i3-12100F
-
- MEM: 32GB
- GPU: NVIDIA GeForce RTX3050 8GB
软件方面,我们以以下版本进行了配置。
Ubuntu 使用的是 Minimal install 的桌面版,而不是服务器版。
-
- Ubuntu: 22.04.1
-
- NVIDIA Driver: 525.60.11
-
- Containerd: 1.6.12
- Kubernetes: 1.25.5
设定
我将在下面写出环境设置步骤。
1. 安装NVIDIA驱动程序
首先要安装GPU驱动程序。
执行以下命令即可。
ubuntu-drivers devices
会显示可安装的驱动程序列表。
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002507sv00001043sd00008876bc03sc00i00
vendor : NVIDIA Corporation
driver : nvidia-driver-515-open - distro non-free
driver : nvidia-driver-510 - distro non-free
driver : nvidia-driver-525-open - distro non-free recommended
driver : nvidia-driver-515 - distro non-free
driver : nvidia-driver-470 - distro non-free
driver : nvidia-driver-515-server - distro non-free
driver : nvidia-driver-525 - distro non-free
driver : nvidia-driver-470-server - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin
这次我安装了nvidia-driver-525。
sudo apt install nvidia-driver-525
为了重新加载驱动程序,将重新启动整个操作系统。
sudo reboot
确认是否识别了NVIDIA的模块。
lsmod | grep nvidia
nvidia_uvm 1363968 0
nvidia_drm 69632 3
nvidia_modeset 1208320 5 nvidia_drm
nvidia 56127488 190 nvidia_uvm,nvidia_modeset
drm_kms_helper 311296 1 nvidia_drm
drm 622592 7 drm_kms_helper,nvidia,nvidia_drm
2. 安装 Containerd
接下来我们将安装Containerd。
在进行的过程中,请参考这些文档。
禁用Swap功能。
sudo swapoff -a
# /etc/fstabからswapfileのマウント行を削除
sudo vi /etc/fstab
导入所需的模块。
sudo modprobe overlay
sudo modprobe br_netfilter
sudo modprobe vxlan
请在重新启动后编写配置文件,以便自动加载模块。
overlay
br_netfilter
vxlan
我将设置内核参数。
请创建以下的配置文件,
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
我会在命令中进行反映。
sudo sysctl --system
安装 Containerd。
sudo apt install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update && sudo apt install -y containerd.io
3. 安装NVIDIA容器工具包
在接下来的步骤中,我们将安装NVIDIA容器工具包。
我查阅了以下文档,并在其基础上做了一些修改。
添加NVIDIA存储库并安装nvidia-container-toolkit软件包。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && \
curl -s -L https://nvidia.github.io/libnvidia-container/ubuntu22.04/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update && sudo apt install -y nvidia-container-toolkit
首先,使用Containerd的命令生成默认配置文件,以便设置Containerd来使用NVIDIA Container Toolkit。
containerd config default | sudo tee /etc/containerd/config.toml
我已经将Containerd的运行时编辑为使用nvidia。我准备了与编辑后文件的差异以补丁形式提供。
--- config.toml 2022-12-15 01:52:36.050473142 +0900
+++ /etc/containerd/config.toml 2022-12-15 01:56:06.024187694 +0900
@@ -76,7 +76,7 @@
max_conf_num = 1
[plugins."io.containerd.grpc.v1.cri".containerd]
- default_runtime_name = "runc"
+ default_runtime_name = "nvidia"
disable_snapshot_annotations = true
discard_unpacked_layers = false
ignore_rdt_not_enabled_errors = false
@@ -122,7 +122,17 @@
NoPivotRoot = false
Root = ""
ShimCgroup = ""
- SystemdCgroup = false
+ SystemdCgroup = true
+
+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
+ privileged_without_host_devices = false
+ runtime_engine = ""
+ runtime_root = ""
+ runtime_type = "io.containerd.runc.v2"
+
+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
+ BinaryName = "/usr/bin/nvidia-container-runtime"
+ SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]
base_runtime_spec = ""
使用以下命令进行应用。
sudo patch /etc/containerd/config.toml containerd-config.patch
我们重新启动Containerd。
sudo systemctl restart containerd
重启后,启动测试用的镜像并进行操作确认。
sudo ctr image pull docker.io/nvidia/cuda:11.6.2-base-ubuntu20.04
sudo ctr run --rm -t \
--runc-binary=/usr/bin/nvidia-container-runtime \
--env NVIDIA_VISIBLE_DEVICES=all \
docker.io/nvidia/cuda:11.6.2-base-ubuntu20.04 \
cuda-11.6.2-base-ubuntu20.04 nvidia-smi
如果显示了驱动版本和CUDA版本就可以了。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.11 Driver Version: 525.60.11 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A |
| 42% 25C P8 6W / 130W | 33MiB / 8192MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
4. 部署Kubernetes集群
开始设置Kubernetes集群。
首先添加软件包仓库。获取并放置GPG文件,
curl -o kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
sudo mv kubernetes-archive-keyring.gpg /usr/share/keyrings/kubernetes-archive-keyring.gpg
创建存储库的列表文件。
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main
安装与Kubernetes相关的包。
sudo apt update
sudo apt install kubelet=1.25.5-00 kubeadm=1.25.5-00 kubectl=1.25.5-00
sudo apt-mark hold kubelet kubeadm kubectl
我們將使用 kubeadm 進行集群的設置。
sudo kubeadm init
为了使普通用户能够使用kubectl命令,将设置文件复制一份。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装Helm。
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
sudo apt install helm
我们这次使用了CNI的Cilium。我们将使用Helm进行安装。
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.12.4 \
--namespace kube-system \
--set operator.replicas=1
由于本次群集只有一个节点,控制平面和工作节点是通用的。我们将对控制平面节点的Pod进行解绑,以便可以调度Pod。
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
5. 连接到Azure Arc.
我们将把Kubernetes集群连接到Azure Arc。
使用Azure CLI进行设置。
# CLIに拡張機能をインストール
az extension add --name connectedk8s
# サブスクリプションにプロバイダーを登録
az provider register --namespace Microsoft.Kubernetes
az provider register --namespace Microsoft.KubernetesConfiguration
az provider register --namespace Microsoft.ExtendedLocation
# 登録完了を確認
az provider show -n Microsoft.Kubernetes -o table
az provider show -n Microsoft.KubernetesConfiguration -o table
az provider show -n Microsoft.ExtendedLocation -o table
# リソースグループを作成
az group create -n AzureML -l japaneast
# KubernetesクラスターをAzure Arcに接続
az connectedk8s connect -n GPUCluster -g AzureML
最后
因为负担变得太重了,所以我们将在GPU集成的Kubernetes集群的Azure Arc连接上暂时停下来。我们将在另一篇文章中介绍在Azure Machine Learning上使用Kubernetes集群的情况。敬请期待下半部分(计划中)。