本文基於E-HPC自訂Ray叢集方案,給出了具體的Ray叢集環境部署過程,並基於搭建好的Ray叢集,介紹了基於PyTorch的映像分類批量推理基礎實踐。對於Ray分散式運算架構而言,其不僅適用於AI情境的分布式訓練、模擬評估、策略服務執行任務,也可通用於巨量資料及各類大規模批次運算情境,支援使用者結合具體業務情境進行靈活的功能定製研發。
背景資訊
Ray 是一個通用的開源分散式運算架構,特別適用於機器學習、強化學習和其他計算密集型任務。它提供了一套簡單、靈活、高效、通用的API,來協助開發人員輕鬆構建可擴充的分布式應用。
本文結合E-HPC自訂叢集及模板,提供了一套Ray叢集的高效部署使用方式,並支援雲上CPU、GPU等各類資源擴容縮容,降低AI應用研發人員的學習維護成本,提升行業研究效率。
準備工作
選擇以下任一方式建立Ray叢集。
重要目前支援建立Ray叢集的地區包括杭州、上海和北京。
本文使用的叢集配置樣本如下:
配置項
配置
系列
標準版
部署模式
自訂叢集
叢集類型
CUSTOM
節點配置
包含
1個登入節點和1個計算節點,規格如下:登入節點:採用ecs.c8a.xlarge執行個體規格,該規格配置為4 vCPU,8 GiB記憶體。
計算節點:採用ecs.c8a.xlarge執行個體規格,該規格配置為4 vCPU,8 GiB記憶體。
重要建立叢集後,擴容Ray叢集計算節點。具體操作,請參見建立節點。
說明請根據實際業務需求,調整登入節點和計算節點的執行個體規格,以提高或降低資源配置。
執行個體安全性群組
允許存取5901(VNC訪問連接埠)、8265(Ray Dashboard訪問連接埠)。具體操作,請參見管理安全性群組規則。
叢集鏡像
登入節點/計算節點:ray_ubuntu20.04_v1.0
說明在社區鏡像裡選擇ray_ubuntu20.04_v1.0

系統名稱
Ubuntu 20.04 64位
步驟一:查看叢集狀態
通過Workbench遠端連線Ray叢集登入節點。更多資訊,請參見使用Workbench工具以SSH協議登入Linux執行個體。
執行命令
ray status查看叢集狀態。ray status
Ray Dashboard查看。
通過VNC串連,在瀏覽器上輸入地址
IP:8265查看Genome圖形案頭。更多資訊,請參見通過VNC串連執行個體。
(可選)若需公網訪問可單擊配置Elastic IP Address。

步驟二:Pytorch映像分類批量推理
基於建立的Ray叢集提交Pytorch推理任務主要有兩種方式。
Ray job方式提交(推薦)
說明基於Ray job方式,適合批處理及無需保持串連的情境;在Ray叢集Head節點,或者與Head網路及8265連接埠連通的遠程機器上執行均可。
單個任務執行。
通過Workbench遠端連線Ray叢集登入節點。更多資訊,請參見使用Workbench工具以SSH協議登入Linux執行個體。
下載測試檔案images.tar並解壓至
/home/test目錄下。tar -zxvf images.tar -C /home/test/下載ray_image_classify.py指令碼至
/home/test目錄下。執行以下命令,查看Ray叢集基礎資訊。
python -c "import ray; ray.init(); print(ray.cluster_resources())"單個Ray job提交,替換IP為登入節點IP。指定
/home/test/images為輸入檔案路徑,/home/test/images_prediction為輸出路徑。ray job submit --address http://IP:8265 --working-dir . -- /usr/local/fce/Python-3.11.9env/bin/python ray_image_classify.py /home/test/images /home/test/images_prediction執行成功的輸出如下:

分類預測的資料及結果如下:images為輸入圖片資料,images_prediction為輸出資料,圖片預測的分類包括tench,bittern及coho等。

通過VNC串連,在對應輸出目錄下查看。更多資訊,請參見通過VNC串連執行個體。

批量任務執行。
基於Pytorch分類images目錄下的所有映像為例(作業數對應子目錄數量),批量提交ray作業並輸出分類預測結果。
在
/home/test/目錄下建立ray_jobs_batch.sh指令碼。並替換指令碼中export RAY_ADDRESS參數的IP為登入節點IP。#!/bin/bash # 輸入和輸出目錄 input_dir=$1 output_dir=$2 export RAY_ADDRESS="http://IP:8265" # 檢查輸入目錄是否存在 if [ ! -d "$input_dir" ]; then echo "Input directory does not exist: $input_dir" exit 1 fi # 檢查輸出的目錄是否存在 if [ ! -d "$output_dir" ]; then echo "Input directory does not exist, creating.." mkdir -p "$output_dir" fi # 遍曆 input_dir 下的所有子目錄 for subdir in "$input_dir"/*; do if [ -d "$subdir" ]; then subdir_name=$(basename "$subdir") input_subdir="${input_dir}/${subdir_name}" output_subdir="${output_dir}/${subdir_name}_prediction" # 提交 Ray 任務 echo "Submitting Ray job for directory: $input_subdir" ray job submit --no-wait --working-dir . -- /usr/local/fce/Python-3.11.9env/bin/python ray_image_classify.py $input_subdir $output_subdir fi done echo "All Ray jobs have been submitted."執行指令碼
ray_jobs_batch.sh。source ray_jobs_batch.sh /home/test/images /home/test/images_prediction執行命令
ray job list查看工作清單。ray job list
也可通過Ray Server Dashboard查看,作業提交運行中如下:

作業運行完成如下:

分類預測的資料及結果如下:
images_input1/images_input2/images_input3為輸入圖片資料,images_input1_prediction/images_input2_prediction/images_input3_prediction為輸出資料,圖片預測的分類包括tench,barracouta及coho等。

images_input1_prediction中預測的鯉魚分類圖片樣本如下:

Ray Client方式提交
說明基於Ray Client方式,主要適用於互動開發調試任務情境,需要保持用戶端串連。
在
/home/test/目錄下建立raytask.py指令碼,內容如下。import ray ray.init(address='auto') # 定義任務。 @ray.remote def square(x): return x * x # 啟動四個並行的任務。 futures = [square.remote(i) for i in range(4)] # 擷取結果。 print(ray.get(futures)) # -> [0, 1, 4, 9]執行指令碼
raytask.py。python raytask.py
