用户指南

User Guide
技術文檔
  • boyue 使用說明
  • boyue-Rancher集成指南
  • 使用Helm部署boyue
  • 在Rancher k3s上快速開始使用boyue

概述

boyue vGPU軟件是一個為雲或者資料中心內的AI應用,CUDA應用提供GPU資源池化,提供GPU虛擬化能力的系統軟體。 通過高效的通訊機制,使得AI應用,CUDA應用可以運行在雲或者資料中心內任何一個物理機,Container或者VM內而無需掛載物理GPU。 同時為這些應用程序提供在GPU資源池中的硬體算力。 通過這種boyue GPU池化的能力,可以提供多個優點:

  • 兼容已有的AI應用和CUDA應用,使其仍然具有使用GPU加速的效能
  • 为AI應用和CUDA應用在云和数据中心的部署提供了很大的灵活度。无需受GPU服务器位置、资源数量的约束。
  • boyue GPU资源随AI應用和CUDA應用启动时分配,随應用程序退出时自动释放。减少GPU空闲时间,提高共享GPU的周转率。
  • 通過對GPU資源池的管理和優化,提高整個雲和資料中心GPU的利用率和吞吐率。
  • 通過統一管理GPU,減輕GPU的管理複雜度和成本。

支持清單

處理器

  • x86_64

作業系統

  • 64位CentOS 6 /7
  • 64位 Ubuntu 16 / 18 / 20

NVIDIA GPU

  • NVIDIA Tesla系列:H系列、L系列、A系列、T系列、V系列、P系列、M系列
  • NVIDIA GeForce系列:RTX 30系列、RTX 20系列、GTX 10系列、GTX 98/97/96/95/75系列
  • NVIDIA Quadro 系列:RTX系列、GV/GP系列、P系列、M系列

寒武紀 MLU

  • MLU-370-X4 / X8
  • MLU-270-X5K

中科海光 DCU

  • Z100L、Z100

NVIDIA CUDA

  • CUDA 12.0,12.1
  • CUDA 11.0, 11.1, 11.2, 11.3, 11.4,11.5,11.6,11.7,11.8
  • CUDA 10.0, 10.1, 10.2
  • CUDA 9.0, 9.1, 9.2

寒武紀 Neuware

  • Neuware-3.4.2
  • Neuware-3.0.2
  • Neuware-2.8.5
  • Neuware-2.7.3
  • Neuware-2.6.4
  • Neuware-2.5.2

中科海光 DTK

  • DTK-22.04

深度學習框架

  • TensorFlow for CUDA : 1.8 - 2.12
  • TensorRT : 5.x  / 6.x / 7.0 / 7.1 / 7.2  /8.x
  • Pytorch for CUDA : 1.0 - 2.0
  • PaddlePaddle: 1.5 / 1.6 / 2.0 / 2.1 / 2.2/ 2.3.2
  • ONNX : 1.0 / 1.1 / 1.2 / 1.3 / 1.4 / 1.5 / 1.6 / 1.7 / 1.8 / 1.9 / 1.10 / 1.11/1.12
  • MXNet :1.4.1 / 1.6 / 1.7 / 1.8 / 1.9
  • XGBoost :0.72、0.8、0.9
  • NVCaffe :1.0
  • Cambricon Tensorflow for Neuware:1.15 / 2.4
  • Cambricon Pytorch for Neuware:1.6 / 1.9
  • Cambricon Tensorflow Horovod:0.12.1
  • Cambricon Magicmind:0.6
  • DTK Tensorflow :1.15/2.7
  • DTK PyTorch:1.10
  • DTK PaddlePaddle:2.3.0

網絡

  • TCP/IP以太網络
  • RDMA網络(InfiniBand和RoCE)

容器環境

  • Docker 12.03 及以後版本

虛擬化環境

  • QEMU-KVM (QEMU 2.8以上)

容器框架

  • Kubernetes 1.10 及以後版本

更多相容環境未逐一列出,聯繫我們詳細瞭解

已知問題

下麵列出當前版本不支持的CUDA庫、工具以及使用模式

  • 不支持CUDA應用程序使用 Unified Memory
  • 不支持 nvidia-smi 工具
  • 有限支持CUDA IPC,對部分程式可能不支持。

必要組件介紹

boyue Controller

該組件為一個長運行的服務程式,其負責整個GPU資源池的資源管理。 其響應boyue Client的vGPU請求,並從GPU資源池中為boyue Client端的CUDA應用程序分配並返回boyue vGPU資源。
該組件可以部署在資料中心任何網絡可到達的系統當中。 每個資源池部署一個該組件。 資源池的大小取決於IT管理的需求,可以是整個資料中心的所有GPU作為一個資源池,也可以每個GPU服務器作為一個獨立的資源池。

boyue Server

該組件為一個長運行的系統服務,其負責GPU資源化的後端服務程式。 boyue Server部署在每一個CPU以及GPU節點上,接管本機內的所有物理GPU。 通過和boyue Controller的互動把本機的GPU加入到由boyue Controller管理維護的GPU資源池當中。
當boyue Client端應用程序運行時,通過boyue Controller的資源調度,建立和boyue Server的連接。 boyue Server為其應用程序的所有CUDA調用提供一個隔離的運行環境以及真實GPU硬體算力。

boyue Client

該組件為一個運行環境,其類比了NVidia CUDA的運行庫環境,為CUDA程式提供了API介面相容的全新實現。 通過和boyue其他功能組件的配合,為CUDA應用程序虛擬化了一定數量的虛擬GPU(boyue vGPU)。
使用CUDA動態連結程式庫的CUDA應用程序可以通過作業系統環境設定,使得一個CUDA應用程序在運行時由作業系統負責連結到boyue Client提供的動態連結程式庫上。 由於boyue Client類比了NVidia CUDA運行環境,囙此CUDA應用程序可以透明無修改地直接運行在boyue vGPU之上。

典型部署架構

以下介紹兩種常見的boyue GPU資源池化部署方案。 一種是All-in-One的本地GPU虛擬化方案,一種是部署到分佈式多臺物理機的GPU資源池化方案。

boyue GPU 資源池化方案

分佈式GPU資源池化方案指的是把一臺或者多臺服務器內的GPU作為資源池,通過boyue向局域網內任一個物理機、Container或者VM內的CUDA應用程序提供虛擬化GPU的部署管道。
選擇局域網內至少一個Linux服務器部署boyue Controller。 該Controller必須可以被屬於同一個資源池的其他boyue組件通過網絡訪問。
每一個服務器上部署boyue Server服務,boyue Server自動適配該服務器是否安裝有GPU,從而開啟不同的功能。 在每一個需要運行CUDA應用程序的物理機、Container和VM裏部署boyue Client運行庫。 各個boyue組件通過boyue Controller的控制功能完成服務發現,資源調度等功能。
從邏輯上,以上各個boyue組件使用了control plane和data plane兩套網絡。 其中control plane用於和boyue Controller組件的通訊。 該部分通訊流量不大,對網路延遲和頻寬需求不高。 data plane用於boyue Client和boyue Server之間執行CUDA任務之間的通訊。 該部分對於網絡的延遲和頻寬有一定需求。 建議使用支持RDMA的網絡。 在實際環境中,control plane和data plane可以是同一個物理網絡。

安裝部署

以下安裝部署的步驟,說明,均以boyue套裝軟體存放路徑在/root/boyue為例進行說明

GPU Monitor

該組件為可選組件,用於監控物理GPU的利用率。 如果生產環境中已有其他替代的功能,該組件可以不用部署。

環境依賴

  • Docker容器環境
  • 與Docker版本匹配的Nvidia Docker runtime
  • Nvidia GPU驅動

執行如下命令導入容器鏡像,並運行服務

cd /root/boyue/gpu-monitor
gunzip dcgm-exporter.tar.gz | docker load
gunzip node-exporter.tar.gz | docker load
./run-nvidia-exportor.sh

boyue Controller

boyue Controller包括物理GPU管理,vGPU資源分配,GUI監控,管理功能。 在典型使用場景下,在一個分佈式環境,僅需要部署一個實例。 以下通過容器化部署boyue Controller。

環境依賴

  • Docker容器環境

啟動文件下載

用戶在部署boyue Controller之前,需確保已經下載啟動檔案。

如何下載啟動檔案:

進入數字中國官网

進入產品頁面

經管理員稽核後,成功申請試用,或者已經付費購買的用戶,可以進入您的個人中心頁面,點擊“下載啟動檔案”按鈕獲取您的啟動檔案。 對於聯網環境和非聯網環境的用戶,需要下載啟動檔案的管道有所不同,詳情請參攷“下載啟動檔案”頁面描述。

进入/root/boyue/controller目录

cd /root/boyue/controller

用您下載到的啟動檔案license.txt替換/root/boyue/controller目錄裏的已有的license.txt即可。

啟動 boyue Controller 服務

執行如下命令導入容器鏡像,並運行服務

cd /root/boyue/controller
gunzip boyue-controller-ent-2.2.tar.gz | docker load
gunzip prometheus.tar.gz | docker load

編輯設定檔 /root/boyue/controller/prometheus.yml 修改staticconfigs中的targets 清單,該清單是安裝了GPU Monitor服務的GPU服務器的清單。 當GPU Monitor有多個IP網段地址的時候,該地址應該與第3章節部署boyue Server時綁定的數據網段相同,例如檔案中的“boyueBINDADDR=CCCC”地址,或者是boyue Server的設定檔中的bindaddr相同。
執行如下命令運行boyue Controller服务:

cd /root/boyue/controller
./run-controller.sh

服務成功啟動後,根據荧幕輸出提示,在本宿主機的所有網段提供如下服務:

  • 調度服務:部署boyue Server時需要配寘該地址
  • Web GUI服務:通過瀏覽器訪問該服務進行監控和管理

boyue Controller的日誌檔

boyue Controller的日誌檔存放在boyue Controller容器內的/root/controller.log中

boyue Server

boyue Server為GPU資源池化提供底層的虛擬GPU服務。 在所有的CPU節點、GPU節點均需部署該服務。
boyue Server支持的虛擬化/容器平臺有:

  • Docker :>= 1.13
  • Libvirt + QEMU-KVM : QEMU > 2.0.0

CUDA業務運行KVM虛擬的場景,在把boyue Server部署至宿主機時,由於宿主機可能存在SELinux,apparmor的限制,安裝boyue Server之後的配寘,僅對安裝之後新創建的虛擬機器,或者是從Power OFF狀態重新啟動的虛擬機器生效。

環境依賴

對於無物理GPU的CPU節點

  • g++ 4.8.5 或以上版本
  • Linux基本庫依賴libcurl3, libibverbs1, numactl-libs(libnuma), libvirt-devel
  • 如果使用Mellanox RDMA網絡,需要安裝RDMA驅動,以及Mellanox的OFED

GPU節點額外的環境需求

  • 安裝有 Nvidia 物理 GPU 驅動
  • NVIDIA CUDA SDK 9.0, 9.1, 9.2, 10.0, 10.1
  • NVIDIA CUDNN 7.4.2 以上版本,推薦 7.6.x
  • NVIDIA NCCL 和最高CUDA SDK版本匹配

在CPU、GPU 服務器宿主機執行如下命令安裝 boyue Server

cd /root/boyue/server
sudo ./install-server.sh

配寘 boyue Server

通過設定檔 /etc/boyue/server.conf 可以對 boyue Server 進行必要的配寘,其中支持的配置選項有:

[log]
log_with_time = true    ; 记录日志的时候是否添加时间戳
log_to_screen = true    ; 日志是否输出到屏幕的标准输出
log_to_file = true      ; 是否记录日志至磁盘文件中
log_level = INFO        ; 日志级别,支持 INFO, DEBUG
file_log_level = INFO   ; 日志输出到文件中的日志级别

[controller]
controller_addr = 127.0.0.1:9123    ; boyue Controller的调度器IP地址和端口

[server]
vgpu_count = 4          ; 默认一个物理GPU被拆分成多少个vGPU
bind_addr = 127.0.0.1   ; data plane的IP地址
;bind_net =             ; data plane的网络名字,例如eth0, eth1。bind_addr 和 bind_net 仅能配置1个
listen_port = 9960      ; boyue Server的服务端口
enable_kvm = true       ; 是否支持boyue Client运行在KVM的VM中
enable_shm = true       ; 是否使用共享内存加速通讯
enable_rdma = true      ; 是否使用RDMA加速通讯
ibverbs_device = mlx5_0 ; 如果使用RDMA,硬件设备名。仅在boyue Server无法推断硬件时需要配置

[server-nccl]
comm_id = 127.0.0.1:9970; nvidia NCCL通讯的网络和端口

[throttle]
throttle_level = 100                ; 算力控制的隔离程度,取值范围[0, 100]。数字越少隔离越好
enable_computation_throttle = true  ; 是否启动算力控制
computation_throttle_mode2 = true   ; 算力控制的模式,仅支持true

boyue Server任務控制

通過如下命令可以啟動boyue Server

sudo systemctl start boyued

通過如下命令可以執行其他boyue Server操作

sudo systemctl stop boyued      ## 停止boyue Server服务
sudo systemctl restart boyued   ## 重启boyue Server服务
sudo systemctl status boyued    ## 查看boyue Server服务状态
sudo systemctl enable boyued    ## 添加boyue Server服务到开机启动服务
sudo journalctl -u boyued       ## 查看boyue Server的服务日志

boyue Server的日誌檔

boyue Server的日誌存在兩個位置

  • /var/log/boyue/server.log 該檔案記錄了所有boyue Client的握手過程
  • /var/log/boyue/session 該目錄以單個檔案的形式,記錄了每次業務運行時的日誌。 每運行一個boyue Client應用,該目錄產生一個獨立的日誌檔。 如果在握手過程中失敗,則不產生日誌檔。

多版本 CUDA SDK 共存

boyue Server可以同時支持多個CUDA版本,使得依賴不同CUDA版本的上層應用可以同時使用boyue vGPU。 為了支持多個CUDA SDK版本,boyue Server要求CUDA安裝在宿主機默認路徑(即/usr/local/cuda-x.y)下麵。 例如為了支持 CUDA 10.0 和 CUDA 9.0,/usr/local 目錄下應該有 cuda-9.0cuda-10.0 這兩個目錄。

此外,多CUDA版本共存時,不需要設定 CUDA_HOMELD_LIBRARY_PATH 等環境變數,也不依賴於部分用戶環境中存在的軟連結 /usr/local/cuda => /usr/local/cuda-x.y,這是因為boyue Server可以根據boyue Client環境中實際安裝的Runtime對應於CUDA的版本號,動態選擇合適的CUDA SDK版本。

查看 boyue 服務狀態

在同一個局域網內,通過瀏覽器(推薦chrome)訪問boyue Controller所在環境的局域網地址: http://IP:Port
其中IP為boyue Controller所在環境的局域網地址,Port為部署boyue Controller時提示的Web GUI的服務埠。 通過默認用戶名(密碼)登入進入系統:admin(admin)
在側邊欄裏看到boyue Controller的IP地址,點擊展開之後有如下的內容:

  • 摘要:顯示boyue Controller所管理的整個boyue vGPU資源池的資源數量,節點狀態等
  • 任務:顯示正在運行且使用了boyue vGPU資源的任務,以及每個任務使用的vGPU資源的分布情况
  • boyue GPU節點清單:通過點擊展開可以看到一組GPU節點的狀態,並且在每個節點的工作面板上看到物理GPU的劃分使用情况

部署 boyue Client

環境依賴

  • g++ 4.8.5 或以上版本,libcurl,openssl,libuuid, libibverbs1

軟體安裝

在CUDA應用環境執行如下的安裝命令

cd /root/boyue/client
sudo ./install-client-x.y

上述命令的x,y為根據所需CUDA版本選擇對應的installer,例如install-client-10.0 對應於 CUDA 10.0
上述命令把boyue Client環境安裝至默認路徑 /usr/lib/boyue 中,並通過 ldconfig 機制將 /usr/lib/boyue 添加到系統動態庫搜索路徑。
注意:如果boyue Client按照到和GPU同樣的宿主機環境,由於boyue Client安裝的/usr/lib/boyue和物理GPU的CUDA SDK可能存在版本衝突。 對於同樣的動態庫在兩個不同磁片位置的加載順序,應該由安裝人員自己維護解决。

配寘 boyue Client

boyue Client 可以通過三類方法配寘運行參數

  • 通過環境變數配寘運行參數
  • 通過當前用戶home目錄中{$HOME}/.boyue/client.conf設定檔配寘運行參數
  • 通過 /etc/boyue/client.conf 設定檔配寘運行參數

上述方法中,通過環境變數配寘的優先順序最高,系統/etc/boyue 目錄中設定檔的優先順序最低

boyue Client 的配寘中分為靜態配寘部分和動態配寘部分。

  • 靜態配寘部分指的是在目標環境中每次運行CUDA應用程序都保持不變的部分。
  • 動態配寘部分指的是根據CUDA應用程序使用的boyue vGPU資源不同而不同的配寘。

設定檔的格式為:

[log]
log_with_time = true    ; 记录日志的时候是否添加时间戳
log_to_screen = true    ; 日志是否输出到屏幕的标准输出
log_to_file = true      ; 是否记录日志至磁盘文件中
log_level = INFO        ; 日志级别,支持 INFO, DEBUG
file_log_level = INFO   ; 日志输出到文件中的日志级别

[controller]
controller_addr = 127.0.0.1:9123    ; boyue Controller的调度器IP地址和端口

[client]
enable_net = false      ; 是否使用TCP网络和boyue Server通讯

其中環境變數 boyueCONTROLLER 設定 boyue Controller 的地址具有比設定檔更高的優先順序 例如在當前SHELL通過 export boyueCONTROLLER 環境變數可以忽略設定檔中的controller_addr配寘

動態配寘包括:

  • 環境變數boyue_ VGPU設定當前環境下CUDA應用程序申請使用多少個boyue vGPU
    • 例如通過export boyue_ VGPU=2指定了當前CUDA應用程序申請使用2個boyue vGPU
    • 該配寘無預設值
  • 環境變數boyue_ GMEM設定當前環境下,CUDA應用程序申請使用的每個boyue vGPU中的顯存大小。 以MiB為組織。
    • 例如通過export boyue_ GMEM=4096為當前CUDA應用程序指定了每個boyue vGPU的顯存大小為4096 MiB。
    • 該配寘的預設值取決於默認一個物理GPU被切分為幾個vGPU
  • 環境變數boyue_ RATIO設定當前環境下,CUDA應用程序申請使用的每個boyue vGPU佔用一個物理GPU算力的百分比。 以%為組織
    • 例如通過 export boyue_ RATIO=50 為當前CUDA應用程序指定了每個 boyue vGPU 的50%的算力。
    • 該配寘的預設值取決於默認一個物理GPU被切分為幾個vGPU
  • 環境變數 boyueCROSSNODE 為可選參數,參數為1且申請多個vGPU時,允許boyue Controller跨越多個物理GPU節點調度資源,使得分配的多個vGPU可能來自於不同的物理GPU節點。
    • 該參數為1時,boyue_ RATIO必須為100
    • 該配寘默認為0

boyue Client日志

boyue Client日誌位於執行應用程序的用戶home目錄中的 ${HOME}/.boyue/log 目錄中。 每次CUDA應用運行均會在該目錄產生一個對應於該次任務的日誌檔。

使用boyue vGPU

本章節介紹在boyue Client環境中,如何為CUDA應用程序配寘使用boyue vGPU

boyue vGPU資源

通過安裝部署boyue vGPU軟件,所有boyue Server所在的GPU服務器內的GPU均加入了一個全域共亯的資源池。 每個物理GPU均被劃分為多個邏輯vGPU。 劃分vGPU的默認細微性為啟動boyue Server時,設定檔 /etc/boyue/server.conf 中的 vgpu_count 參數指定。 若設定 vgpu_count=n,則每個vGPU默認的顯存大小為物理GPU顯存的n分之一。

boyue vGPU的使用

由於boyue vGPU的調用介面相容物理GPU的調用介面,囙此CUDA應用程序可以無感知無修改地像使用物理GPU那樣使用boyue vGPU。 僅需要在運行CUDA應用程序時,通過設定檔、環境變數為本CUDA應用程序配寘運行環境即可。

經過boyue GPU資源池化之後,資源池中的vGPU使用模式為CUDA應用程序即時申請即時使用的模式。 也即是當CUDA應用程序調用CUDA介面初始化時才向boyue GPU資源池申請一定數量的vGPU,當CUDA應用程序退出時其申請到的vGPU自動釋放至資源池中。 多次調用CUDA應用程序分配到的vGPU不一定對應於同樣的物理GPU資源。

當boyue Client的靜態環境配寘完畢後,在運行一個CUDA應用之前,至少需要用boyue_ VGPU環境變數指明該CUDA應用程序希望獲得的vGPU數目。 例如一個deviceQuery CUDA程式,如下的命令使得當該CUDA程式做設備發現時,通過CUDA的介面査詢到2個GPU,每個GPU的顯存是4096MiB。

export boyue_VGPU=2
export boyue_GMEM=4096
./deviceQuery

當上述deviceQuery CUDA程式啟動時,會從boyue GPU資源池中獨佔兩個vGPU。 該程式結束時,會自動釋放兩個vGPU。 可以通過重新設定環境變數,在運行CUDA應用程序之前改變對vGPU資源的使用。一次CUDA應用程序所申請的多個vGPU可能存在於多個物理GPU上。

vGPU的使用對象為CUDA應用程序,而非物理機、Container或者VM虛擬機器。 即使在同一個環境下運行的多個CUDA應用程序,每一個應用程序都按照當前的運行環境向boyue GPU資源池申請獨立的vGPU資源。 如果並行運行多個CUDA應用程序,則消耗的vGPU數量為應用程序數目乘以boyue_ VGPU所指定的vGPU數目。

常見問題

用戶首先需要確認boyue Server和boyue Client版本的匹配。 不同版本之間的boyue Server和boyue Client無法共同使用。

  • boyue Client端應用程序啟動報告無法找到NVidia GPU

    • 此故障為應用程序沒有使用boyue Client運行庫導致,可能的原因有幾種:
      • 該應用程序在編譯期間靜態連結了NVidia的庫,導致其運行時並不調用boyue Client的運行庫。 該問題應該通過設定動態連結並重新編譯解决。
      • 該應用程序雖然使用CUDA相關的動態連結程式庫,但是編譯器使用rpath選項指明了CUDA庫加載的絕對路徑,而該路徑並非是boyue Client的安裝路徑。 rpath優先順序高導致庫加載的路徑非期望的boyue Client安裝路徑。 該問題或者通過去掉rpath設定後重新編譯解决,或者用boyue Client運行庫覆蓋rpath指明的路徑內的庫解决。
      • boyue Client庫的安裝路徑沒有使用ldconfig或者環境變數LDLIBRARYPATH放到動態庫加載路徑。 該問題通過使用ldconfig永久把boyue Client的安裝路徑加入到系統蒐索路徑,或者正確使用環境變數LDLIBRARYPATH來設定。
  • boyue Server服務無法啟動,boyued行程啟動失敗

    • 通過運行boyue-check runtime server來檢查環境。 可能的原因有
    • boyued行程依賴CUDA,CUDNN庫無法蒐索到導致可執行文件無法被作業系統啟動。
      • 修改上述boyue Server服務設定檔
    • boyued行程依賴的其他庫沒有安裝,例如libcurl,libopenssl等