背景は、実験室が多くの高性能サーバーを購入しましたが、運用には詳しくなく、複雑な専門サービスを使用したくありませんでした。そのため、各ユーザーに Docker を作成し、Portainer で管理することにしました。皆で RAID0 ディスクスペースを共有し、一人一つの GPU を使用し、CPU 利用率を均等に分配します。サーバーのシステムは CentOS 7 です。
以下は使用されるすべてのコマンドです:
## RAID0の設定
sudo yum install mdadm
# 3つのデバイスに基づいてRAIDボリューム/dev/md0を作成します
sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=3 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
# ボリュームを再フォーマットします
sudo mkfs.ext4 /dev/md0
# マウントポイントを作成します
sudo mkdir -p /data
sudo mount /dev/md0 /data
# 自動マウント
echo '/dev/md0 /data ext4 defaults 0 0' | sudo tee -a /etc/fstab
# RAID構成を保存します
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
# RAIDアレイを確認します
cat /proc/mdstat
# RAID0のパフォーマンスを向上させます
sudo blockdev --setra 65536 /dev/md0
echo 32768 | sudo tee /sys/block/md0/md/stripe_cache_size # うまく動作しません
# ==============================================================================
## Portainerのインストール
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker
sudo systemctl start docker
sudo systemctl enable docker
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer_data:/data portainer/portainer-ce:latest
## Portainerエージェントのインストール、すべてのサーバーを簡単に管理できます
docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent
# ==============================================================================
## NVIDIA Dockerの設定
# Nvidia Container Toolkitの設定
sudo rpm --import https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
sudo yum install -y nvidia-docker2
sudo systemctl daemon-reload
sudo systemctl restart docker
# インストールのテスト
docker run --rm --gpus all nvidia/cuda:12.0.0-devel-ubi8 nvidia-smi
# ==============================================================================
## IPフォワードを有効にする
sudo su
echo 1 > /proc/sys/net/ipv4/ip_forward
# パブリックホストポート
sudo iptables -I INPUT -p tcp --dport 10241:10299 -j ACCEPT
sudo iptables-save
# ==============================================================================
## CUDAバージョンに基づいてUbuntuコンテナを設定する
user="hans"
device='"device=0,1"' # "all"
image="nvidia/cuda:12.0.0-devel-ubuntu22.04" # nvidia/cuda:12.2.2-devel-ubuntu22.04 nvidia/cuda:12.0.0-devel-ubuntu22.04
port=10333
cd /data
sudo mkdir $user
docker run -itd --name ubuntu-$user --ipc=host --pid=host --gpus $device --restart=always -v /data/$user:/home --shm-size 64g --cpu-shares 1024 -p $port:$port --net=bridge $image
# UbuntuのためにSSHを設定する
docker exec -it ubuntu-$user /bin/bash
apt update && apt install vim ssh sudo make gcc g++ build-essential nfs-common virtualenv git curl
passwd
swansea@CS
echo "PubkeyAuthentication yes" | tee -a /etc/ssh/sshd_config
echo "PermitRootLogin yes" | tee -a /etc/ssh/sshd_config
echo "Port 10333" | tee -a /etc/ssh/sshd_config
service ssh restart
systemctl enable ssh
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64" | tee -a /etc/profile
echo "export PATH=$PATH:/usr/local/cuda/bin" | tee -a /etc/profile
echo "export CUDA_HOME=$CUDA_HOME:/usr/local/cuda" | tee -a /etc/profile
source /etc/profile
# ==============================================================================
## コンテナの設定を修正する
docker commit ubuntu-hans ubuntu-hans-image
# 新しい設定とイメージを使用してコンテナを再実行する
# ==============================================================================
## Node.jsのインストール(オプション)
sudo yum install https://rpm.nodesource.com/pub_16.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm -y
sudo yum install nodejs -y --setopt=nodesource-nodejs.module_hotfixes=1
# localtunnelのインストール
sudo npm install localtunnel