|
| 1 | +# HAMi-core —— CUDA環境向けフックライブラリ |
| 2 | + |
| 3 | +[English](README.md) | [中文](README_CN.md) | 日本語 |
| 4 | + |
| 5 | +## はじめに |
| 6 | + |
| 7 | +HAMi-coreはコンテナ内GPUリソースコントローラーで、[HAMi](https://github.com/Project-HAMi/HAMi)や[volcano](https://github.com/volcano-sh/devices)で採用されています。 |
| 8 | + |
| 9 | +<img src="./docs/images/hami-arch.png" width = "600" /> |
| 10 | + |
| 11 | +## 機能 |
| 12 | + |
| 13 | +HAMi-coreには以下の機能があります: |
| 14 | +1. デバイスメモリの仮想化 |
| 15 | +2. 自己実装のタイムシェアリングによるデバイス使用率の制限 |
| 16 | +3. リアルタイムデバイス使用率モニタリング |
| 17 | + |
| 18 | + |
| 19 | + |
| 20 | +## 設計 |
| 21 | + |
| 22 | +HAMi-coreは、以下の図のようにCUDAランタイム(libcudart.so)とCUDAドライバー(libcuda.so)間のAPI呼び出しをフックすることで動作します: |
| 23 | + |
| 24 | +<img src="./docs/images/hami-core-position.png" width = "400" /> |
| 25 | + |
| 26 | +## Dockerでのビルド |
| 27 | + |
| 28 | +```bash |
| 29 | +make build-in-docker |
| 30 | +``` |
| 31 | + |
| 32 | +## 使用方法 |
| 33 | + |
| 34 | +_CUDA_DEVICE_MEMORY_LIMIT_ はデバイスメモリの上限を指定します(例:1g、1024m、1048576k、1073741824) |
| 35 | + |
| 36 | +_CUDA_DEVICE_SM_LIMIT_ は各デバイスのSM使用率のパーセンテージを指定します |
| 37 | + |
| 38 | +```bash |
| 39 | +# すべてのデバイスに対して1GiBのメモリ制限を追加し、最大SM使用率を50%に設定 |
| 40 | +export LD_PRELOAD=./libvgpu.so |
| 41 | +export CUDA_DEVICE_MEMORY_LIMIT=1g |
| 42 | +export CUDA_DEVICE_SM_LIMIT=50 |
| 43 | +``` |
| 44 | + |
| 45 | +CUDAアプリケーションをローカルで実行する場合は、まずローカルディレクトリを作成してください。 |
| 46 | + |
| 47 | +``` |
| 48 | +mkdir /tmp/vgpulock/ |
| 49 | +``` |
| 50 | + |
| 51 | +`CUDA_DEVICE_MEMORY_LIMIT`または`CUDA_DEVICE_SM_LIMIT`を更新した場合は、ローカルキャッシュファイルを削除してください。 |
| 52 | + |
| 53 | +``` |
| 54 | +rm /tmp/cudevshr.cache |
| 55 | +``` |
| 56 | + |
| 57 | +## Dockerイメージ |
| 58 | + |
| 59 | +```bash |
| 60 | +# Dockerイメージのビルド |
| 61 | +docker build . -f=dockerfiles/Dockerfile -t cuda_vmem:tf1.8-cu90 |
| 62 | + |
| 63 | +# コンテナ用のGPUデバイスとライブラリマウントの設定 |
| 64 | +export DEVICE_MOUNTS="--device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidiactl:/dev/nvidiactl" |
| 65 | +export LIBRARY_MOUNTS="-v /usr/cuda_files:/usr/cuda_files -v $(which nvidia-smi):/bin/nvidia-smi" |
| 66 | + |
| 67 | +# コンテナを実行してnvidia-smiの出力を確認 |
| 68 | +docker run ${LIBRARY_MOUNTS} ${DEVICE_MOUNTS} -it \ |
| 69 | + -e CUDA_DEVICE_MEMORY_LIMIT=2g \ |
| 70 | + -e LD_PRELOAD=/libvgpu/build/libvgpu.so \ |
| 71 | + cuda_vmem:tf1.8-cu90 \ |
| 72 | + nvidia-smi |
| 73 | +``` |
| 74 | + |
| 75 | +実行後、以下のようなnvidia-smiの出力が表示され、メモリが2GiBに制限されていることが確認できます: |
| 76 | + |
| 77 | +``` |
| 78 | +... |
| 79 | +[HAMI-core Msg(1:140235494377280:libvgpu.c:836)]: Initializing..... |
| 80 | +Mon Dec 2 04:38:12 2024 |
| 81 | ++-----------------------------------------------------------------------------------------+ |
| 82 | +| NVIDIA-SMI 550.107.02 Driver Version: 550.107.02 CUDA Version: 12.4 | |
| 83 | +|-----------------------------------------+------------------------+----------------------+ |
| 84 | +| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | |
| 85 | +| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | |
| 86 | +| | | MIG M. | |
| 87 | +|=========================================+========================+======================| |
| 88 | +| 0 NVIDIA GeForce RTX 3060 Off | 00000000:03:00.0 Off | N/A | |
| 89 | +| 30% 36C P8 7W / 170W | 0MiB / 2048MiB | 0% Default | |
| 90 | +| | | N/A | |
| 91 | ++-----------------------------------------+------------------------+----------------------+ |
| 92 | +
|
| 93 | ++-----------------------------------------------------------------------------------------+ |
| 94 | +| Processes: | |
| 95 | +| GPU GI CI PID Type Process name GPU Memory | |
| 96 | +| ID ID Usage | |
| 97 | +|=========================================================================================| |
| 98 | ++-----------------------------------------------------------------------------------------+ |
| 99 | +[HAMI-core Msg(1:140235494377280:multiprocess_memory_limit.c:497)]: Calling exit handler 1 |
| 100 | +``` |
| 101 | + |
| 102 | +## ログ |
| 103 | + |
| 104 | +環境変数LIBCUDA_LOG_LEVELを使用してログの表示レベルを設定します |
| 105 | + |
| 106 | +| LIBCUDA_LOG_LEVEL | 説明 | |
| 107 | +| ----------------- | ----------- | |
| 108 | +| 0 | エラーのみ | |
| 109 | +| 1(デフォルト),2 | エラー、警告、メッセージ | |
| 110 | +| 3 | 情報、エラー、警告、メッセージ | |
| 111 | +| 4 | デバッグ、エラー、警告、メッセージ | |
| 112 | + |
| 113 | +## Raw APIのテスト |
| 114 | + |
| 115 | +```bash |
| 116 | +./test/test_alloc |
| 117 | +``` |
0 commit comments