:FastAPI+Ray多獎勵模型面板的架構(gòu)與擴展完全指南)
【免費下載鏈接】UniRLUniRL is a Framework for Unified Multimodal Model Reinforcement Learning項目地址https://gitcode.com/gh_mirrors/uni/UniRL點擊查看免費下載UniRL 是一個統(tǒng)一多模態(tài)模型強化學(xué)習(xí)框架其子項目unirl-reward-service是一個基于FastAPI Ray的多獎勵模型面板一個 HTTP 網(wǎng)關(guān)背后掛著若干獎勵模型HPSv2、CLIP、PickScore、ImageReward、GenEval2 等每個模型獨占若干 GPU一次POST /score調(diào)用即可并行拿到多個獎勵分。本文帶你完整走一遍理解架構(gòu) → 單機 3 步部署 → 多機 Ray 集群擴容 → 訓(xùn)練任務(wù)對接 → 擴展新打分器新手也能照著跑起來。 什么是 UniRL 獎勵服務(wù)在強化學(xué)習(xí)訓(xùn)練中獎勵模型負(fù)責(zé)把生成結(jié)果圖片/視頻/文本變成一個標(biāo)量信號。UniRL 提供兩種取用方式local進(jìn)程內(nèi)每個后端只掛一個打分器簡單直接remoteHTTP 面板RewardService通過POST /score調(diào)用遠(yuǎn)端服務(wù)請求里用required_rewards聲明需要哪幾個模型服務(wù)端支持weighted_sum / mean / min / max加權(quán)聚合成一個獎勵并返回每個模型的明細(xì)。把獎勵模型集中到獨立機器的面板服務(wù)上好處很明顯訓(xùn)練機的 GPU 全部留給 rollout 和訓(xùn)練獎勵模型可以跨團隊復(fù)用、獨立擴縮容、獨立升級依賴。? 架構(gòu)拆解FastAPI 網(wǎng)關(guān) Ray WorkerGroup整條調(diào)用鏈非常簡潔Client ──HTTP──? FastAPI Gateway ──Ray actor call──? WorkerGroup(rewardX) ├── actor_0 (獨占 GPU k) └── actor_1 (獨占 GPU k1)每個獎勵對應(yīng)一個WorkerGroup組內(nèi)是若干可配置的 Ray actorreplicas路由按required_rewards把請求分桶bucket后對每個獎勵只發(fā)起一次批量 Ray 調(diào)用組內(nèi)輪詢round-robin選 actor。組件源碼位置職責(zé)HTTP 網(wǎng)關(guān)server.py/score、/health、/rewards端點分桶/派發(fā)/聚合配置解析config.pyYAML → dataclass校驗num_replicas≥1、num_gpus≥0、名字唯一WorkerPoolpool.pyRay 運行時生命周期 組注冊 按名派發(fā)WorkerGroupgroup.pyN 個 actor 輪詢調(diào)度ScorerActoractor.pyray.remote薄殼在 GPU 進(jìn)程內(nèi)構(gòu)建模型BaseScorerbase.py抽象契約score(items) - list[dict[str, float]]Registryregistry.pyregister(name, cls)打分器注冊表服務(wù)對外承諾三重隔離詳見 docs/ARCHITECTURE.md資源隔離GPU 以整數(shù)資源分配num_gpusN同一時刻一塊卡只屬于一個獎勵組錯誤隔離某個獎勵 OOM/超時/崩潰只把異常寫進(jìn)errors[i][reward]同批其他獎勵照常返回不會整批 500依賴隔離每個打分器有獨立的envs/scorer.txtRayruntime_env首次啟動時自動建隔離 venv——imagereward 和 vLLM 可以使用不同版本的 transformers 互不沖突。 單機部署3 步拉起獎勵面板第一步準(zhǔn)備基礎(chǔ)環(huán)境并安裝前置條件已激活Python 3.12環(huán)境且預(yù)裝了 torch nccl這些包太大、強綁定硬件官方不代裝。然后在 unirl-reward-service/ 目錄下執(zhí)行./install.sh # 只裝基礎(chǔ)層ray、fastapi、uvicorn、pillow 等注意各打分器的依賴transformers、vllm、hpsv2……不在這一步安裝它們由 Ray 在 actor 首次啟動時按envs/*.txt自動裝進(jìn)隔離 venv所以首次啟動較慢vLLM 類約 10 分鐘之后復(fù)用緩存幾秒即可就緒。第二步編輯部署配置cp configs/service.example.yaml configs/service.yaml打開 configs/service.example.yaml核心就改三處打開/注釋你需要的獎勵條目默認(rèn)啟用 8 個共 10 張 GPU 預(yù)算把每個條目的weights_path填成你本地的權(quán)重目錄按機器卡數(shù)調(diào)整num_gpus/num_replicas??傤A(yù)算 Σ(num_gpus × num_replicas)不要超過本機 GPU 數(shù)超預(yù)算時ray.init()能成功但 actor 會卡在資源分配上可從/health看到某組 ping 不回來。常用字段速查max_concurrency單 actor 并發(fā)度純前向的 transformers 打分器可放心調(diào)大vLLM 打分器保持 1、score_timeout_s單獎勵超時默認(rèn) 120s、vLLM 類參數(shù)tensor_parallel_size、gpu_memory_utilization、dtype等直接透傳給vllm.LLM。第三步啟動并做健康檢查python -m reward_service --config configs/service.yaml # 等價入口unirl-reward-service --config configs/service.yaml啟動后先打兩個只讀端點確認(rèn)狀態(tài)端點方法說明/healthGET{status: ok, rewards: {名字: [各副本狀態(tài)]}}/rewardsGET已就緒的獎勵列表/scorePOST批量打分主入口 調(diào)用面板批量打分與錯誤隔離最推薦的調(diào)用方式是 Python SDKclient.py請求列表想多長就多長from reward_service.client import RewardClient, RewardRequest client RewardClient(http://localhost:8080) # 跨機時換成服務(wù) IP scores client.score([ RewardRequest(history[(a cute dog, Image.open(dog.png))], required_rewards[hpsv2, clip]), RewardRequest(history[(a cute cat, Image.open(cat.png))], required_rewards[hpsv2, pickscore]), ]) # - [{hpsv2: {hpsv2: 0.27}, clip: {clip: 0.31}}, ...]RLHF 里最常見的模式是一個 prompt × N 張候選圖N 個請求放進(jìn)一次client.score([...])服務(wù)端會把需要同一獎勵的 N 個請求打包成單次 actor 調(diào)用效率遠(yuǎn)高于逐條請求。響應(yīng)中results[i]與errors[i]和requests[i]一一對應(yīng){ results: [ {hpsv2: {hpsv2: 0.27}} ], errors: [ {clip: RayActorError(...)} ] }即clip失敗了只在該請求里記錄異常hpsv2照常出分——客戶端要同時讀兩個字段否則失敗的獎勵會被靜默漏掉??鐧C調(diào)用只需把 URL 換成http://server-ip:8080也可以不裝 SDK 直接用裸requests手寫 HTTP參考 scripts/remote_client_zero_deps.py。 多機擴容加入 Ray 集群只需改一行 YAML單機的 GPU 預(yù)算不夠時可以把多個主機組成 Ray 集群服務(wù)代碼零改動參考 configs/service.cluster.example.yaml2 節(jié)點 × 8 GPU 16 卡預(yù)算export NODE_IP_LIST10.0.0.1:8 10.0.0.2:8 # 第一個節(jié)點是 head bash scripts/ray_start.sh # pdsh 拉起多機 Ray 集群 python -m reward_service --config configs/service.cluster.example.yaml # 拆集群 bash scripts/ray_stop.shscripts/ray_start.sh 啟動完成會打印 head 地址把它填進(jìn) YAML 即可cluster: ray_address: head-ip:6379 # 服務(wù)本身跑在 head 節(jié)點上時用 auto多機部署的兩個調(diào)度要點配置里都有注釋scheduling: packvLLM 張量并行如 GenEval2 的 TP2必須兩卡落在同一節(jié)點跨以太網(wǎng)做 TP 會毀掉吞吐scheduling: spread輕量的 1 卡獎勵開num_replicas: 2 spread讓副本攤到不同節(jié)點兼顧負(fù)載均衡與故障隔離。另外注意 YAML 中獎勵條目的書寫順序多卡 actor 放前面先占好連續(xù)卡槽避免被 1 卡副本把集群切碎。 對接 UniRL 訓(xùn)練任務(wù)一行環(huán)境變量搞定遠(yuǎn)程面板最大的價值是讓訓(xùn)練機的 GPU 全部留給 rollout 與訓(xùn)練。訓(xùn)練側(cè)由 unirl/reward/remote.py 的RemoteRewardBackend負(fù)責(zé)對接官方示例 recipe 見 examples/diffusion/sd3/sd3_nft_reward_service.yamlreward: _target_: unirl.reward.service.RewardService backend: _target_: unirl.reward.remote.RemoteRewardBackend config: _target_: unirl.reward.remote.RemoteRewardSpec base_url: ${oc.env:REWARD_SERVICE_URL,http://localhost:8080} required_rewards: [hpsv2, pickscore, unified_reward, imagereward, hpsv3] reward_weights: {hpsv2: 0.2, pickscore: 0.2, unified_reward: 0.2, imagereward: 0.2, hpsv3: 0.2} batch_size: 8 aggregation_method: weighted_sum # 支持 weighted_sum / mean / min / max訓(xùn)練時只需REWARD_SERVICE_URLhttp://10.0.0.5:8080 python -m unirl.train_diffusion \ --config-dir examples/diffusion/sd3 --config-name sd3_nft_reward_service一次 HTTP 往返就把 5 個獎勵模型的分全拿回來按權(quán)重聚合成訓(xùn)練用的單一獎勵。 擴展指南4 步接入一個新打分器框架的擴展點設(shè)計得很克制網(wǎng)關(guān)、workers、schemas完全不用動新打分器會被注冊表自動發(fā)現(xiàn)。以新增my_reward為例在 reward_service/scorers/ 下新建my_scorer.py實現(xiàn)BaseScorer的score(items) - list[dict[str, float]]模塊末尾register(my_reward, MyScorer)重依賴一律放在__init__/方法內(nèi)不要在模塊頂層 import在 registry.py 的SCORER_MODULES映射里加一行my_reward: reward_service.scorers.my_scorer寫一份envs/my_reward.txt聲明該打分器的 pip 依賴版本沖突的隔離層在configs/service.example.yaml加對應(yīng)條目name/scorer/runtime_env/num_gpus/num_replicas/params并補一個測試。已有子指標(biāo)想擴新指標(biāo)只需擴sub_metric_names元組并在score()返回的 dict 里加鍵——響應(yīng) schema 是 dict[str, float]天然多鍵協(xié)議不變。??一個硬邊界Rayruntime_env的隔離只到Python 包級不能換 Python 解釋器或 torch 底座worker 必須與集群同 Python 小版本。像genevalmmdet/mmcv 棧需要 Python 3.10這種跑不進(jìn)本集群py3.12的打分器官方給了旁路方案在獨立 Python 3.10 主機上用 configs/geneval_service.yaml 單獨起一份服務(wù)再互調(diào)。? 進(jìn)階技巧MPS 共享 GPU 與壓測CUDA MPS 省卡CLIP、PickScore、HPSv2、ImageReward 這類輕量打分器可以各占半張卡num_gpus: 0.5mps:塊服務(wù)會在 Ray 初始化前自動拉起本地 MPS 守護進(jìn)程示例見 configs/service.mps.example.yaml- name: clip num_gpus: 0.5 mps: active_thread_percentage: 100 # H20 535 驅(qū)動下 fp16/bf16 打分器保持 100 device_memory_limit: 20GiB并發(fā)壓測服務(wù)起來后用 scripts/bench_concurrent.py 輸出 p50/p90/p99 延遲與吞吐--sweep一次跑多個并發(fā)檔--per-reward-isolated單獨測每個獎勵的獨立延遲混批時 HTTP 只等最慢的那個返回python3 scripts/bench_concurrent.py --url http://10.0.0.5:8080 \ --concurrency 200 --total 1000 --rewards clip依賴自檢python scripts/check_venvs.py --standalone可核查各打分器 venv 的安裝與隔離狀態(tài)。 關(guān)鍵文件速查表資料相對路徑服務(wù)總 README安裝/啟動/API 全表unirl-reward-service/README.md架構(gòu)與數(shù)據(jù)流設(shè)計文檔unirl-reward-service/docs/ARCHITECTURE.md單機示例配置8 獎勵 10 卡unirl-reward-service/configs/service.example.yaml多機集群示例配置2×8 卡unirl-reward-service/configs/service.cluster.example.yamlMPS 共享 GPU 示例配置unirl-reward-service/configs/service.mps.example.yaml打分器注冊表unirl-reward-service/reward_service/scorers/registry.pyPython SDKRewardClientunirl-reward-service/reward_service/client.py訓(xùn)練側(cè)遠(yuǎn)程后端unirl/reward/remote.py遠(yuǎn)程獎勵訓(xùn)練 recipe 示例examples/diffusion/sd3/sd3_nft_reward_service.yaml多機 Ray 啟停腳本unirl-reward-service/scripts/ray_start.sh? 小結(jié)UniRL 獎勵服務(wù)的精髓是一個 FastAPI 網(wǎng)關(guān) N 個獨占 GPU 的 Ray 獎勵組 三重隔離單機三步即可上線一個多獎勵面板多機擴容只靠一行ray_address配置訓(xùn)練側(cè)一個REWARD_SERVICE_URL環(huán)境變量就能接入。想加新打分器只需寫一個模塊 一行注冊 一份 env 清單網(wǎng)關(guān)與調(diào)度層自動生效。建議按本文順序先跑通service.example.yaml再逐步嘗試 MPS 省卡與多機集群最后擴展自己的獎勵模型。贊分享【免費下載鏈接】UniRLUniRL is a Framework for Unified Multimodal Model Reinforcement Learning項目地址https://gitcode.com/gh_mirrors/uni/UniRL點擊查看免費下載相關(guān)推薦G-Helper 屏幕色彩修復(fù)實操指南華碩筆記本發(fā)白、偏色一次解決G Helper 屏幕色彩修復(fù)實操指南華碩筆記本發(fā)白、偏色一次解決 G Helper 是華碩游戲本上 Armoury Crate 的輕量替代方案它的屏幕色彩桌面應(yīng)用KernelSU 模式切換避坑指南GKI 與 LKM 3 步選對內(nèi)核更新不翻車KernelSU 模式切換避坑指南GKI 與 LKM 3 步選對內(nèi)核更新不翻車 這篇文章解決三件事KernelSU 的 GKI 與 LKM 怎么選、模式切操作系統(tǒng)內(nèi)核驅(qū)動系統(tǒng)編程移動開發(fā)vanilla-extract的社區(qū)貢獻(xiàn)獎勵指南獎勵指南vanilla extract的社區(qū)貢獻(xiàn)獎勵指南獎勵指南 vanilla extract是一個基于TypeScript的零運行時樣式表解決方案Zero ru前端開發(fā)工具上一篇Mirah類型系統(tǒng)深度解析靜態(tài)類型與類型推斷的巧妙設(shè)計下一篇AWS SDK for Java 2.x 操作 Amazon CloudFront 實戰(zhàn)指南分發(fā)、簽名 URL/Cookie 與多租戶場景創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考