在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
image.png

最后

因为负担变得太重了,所以我们将在GPU集成的Kubernetes集群的Azure Arc连接上暂时停下来。我们将在另一篇文章中介绍在Azure Machine Learning上使用Kubernetes集群的情况。敬请期待下半部分(计划中)。

广告
将在 10 秒后关闭
bannerAds