與擴展完全指南)
【免費下載鏈接】UniRLUniRL is a Framework for Unified Multimodal Model Reinforcement Learning項目地址https://gitcode.com/gh_mirrors/uni/UniRL點擊查看免費下載UniRL 是一個統(tǒng)一多模態(tài)模型強化學習框架其子項目unirl-reward-service是一個基于FastAPI Ray的多獎勵模型面板一個 HTTP 網(wǎng)關(guān)背后掛著若干獎勵模型HPSv2、CLIP、PickScore、ImageReward、GenEval2 等每個模型獨占若干 GPU一次POST /score調(diào)用即可并行拿到多個獎勵分。本文帶你完整走一遍理解架構(gòu) → 單機 3 步部署 → 多機 Ray 集群擴容 → 訓練任務對接 → 擴展新打分器新手也能照著跑起來。 什么是 UniRL 獎勵服務在強化學習訓練中獎勵模型負責把生成結(jié)果圖片/視頻/文本變成一個標量信號。UniRL 提供兩種取用方式local進程內(nèi)每個后端只掛一個打分器簡單直接remoteHTTP 面板RewardService通過POST /score調(diào)用遠端服務請求里用required_rewards聲明需要哪幾個模型服務端支持weighted_sum / mean / min / max加權(quán)聚合成一個獎勵并返回每個模型的明細。把獎勵模型集中到獨立機器的面板服務上好處很明顯訓練機的 GPU 全部留給 rollout 和訓練獎勵模型可以跨團隊復用、獨立擴縮容、獨立升級依賴。? 架構(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)每個獎勵對應一個WorkerGroup組內(nèi)是若干可配置的 Ray actorreplicas路由按required_rewards把請求分桶bucket后對每個獎勵只發(fā)起一次批量 Ray 調(diào)用組內(nèi)輪詢round-robin選 actor。組件源碼位置職責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 進程內(nèi)構(gòu)建模型BaseScorerbase.py抽象契約score(items) - list[dict[str, float]]Registryregistry.pyregister(name, cls)打分器注冊表服務對外承諾三重隔離詳見 docs/ARCHITECTURE.md資源隔離GPU 以整數(shù)資源分配num_gpusN同一時刻一塊卡只屬于一個獎勵組錯誤隔離某個獎勵 OOM/超時/崩潰只把異常寫進errors[i][reward]同批其他獎勵照常返回不會整批 500依賴隔離每個打分器有獨立的envs/scorer.txtRayruntime_env首次啟動時自動建隔離 venv——imagereward 和 vLLM 可以使用不同版本的 transformers 互不沖突。 單機部署3 步拉起獎勵面板第一步準備基礎(chǔ)環(huán)境并安裝前置條件已激活Python 3.12環(huán)境且預裝了 torch nccl這些包太大、強綁定硬件官方不代裝。然后在 unirl-reward-service/ 目錄下執(zhí)行./install.sh # 只裝基礎(chǔ)層ray、fastapi、uvicorn、pillow 等注意各打分器的依賴transformers、vllm、hpsv2……不在這一步安裝它們由 Ray 在 actor 首次啟動時按envs/*.txt自動裝進隔離 venv所以首次啟動較慢vLLM 類約 10 分鐘之后復用緩存幾秒即可就緒。第二步編輯部署配置cp configs/service.example.yaml configs/service.yaml打開 configs/service.example.yaml核心就改三處打開/注釋你需要的獎勵條目默認啟用 8 個共 10 張 GPU 預算把每個條目的weights_path填成你本地的權(quán)重目錄按機器卡數(shù)調(diào)整num_gpus/num_replicas??傤A算 Σ(num_gpus × num_replicas)不要超過本機 GPU 數(shù)超預算時ray.init()能成功但 actor 會卡在資源分配上可從/health看到某組 ping 不回來。常用字段速查max_concurrency單 actor 并發(fā)度純前向的 transformers 打分器可放心調(diào)大vLLM 打分器保持 1、score_timeout_s單獎勵超時默認 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啟動后先打兩個只讀端點確認狀態(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) # 跨機時換成服務 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 個請求放進一次client.score([...])服務端會把需要同一獎勵的 N 個請求打包成單次 actor 調(diào)用效率遠高于逐條請求。響應中results[i]與errors[i]和requests[i]一一對應{ 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 預算不夠時可以把多個主機組成 Ray 集群服務代碼零改動參考 configs/service.cluster.example.yaml2 節(jié)點 × 8 GPU 16 卡預算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 地址把它填進 YAML 即可cluster: ray_address: head-ip:6379 # 服務本身跑在 head 節(jié)點上時用 auto多機部署的兩個調(diào)度要點配置里都有注釋scheduling: packvLLM 張量并行如 GenEval2 的 TP2必須兩卡落在同一節(jié)點跨以太網(wǎng)做 TP 會毀掉吞吐scheduling: spread輕量的 1 卡獎勵開num_replicas: 2 spread讓副本攤到不同節(jié)點兼顧負載均衡與故障隔離。另外注意 YAML 中獎勵條目的書寫順序多卡 actor 放前面先占好連續(xù)卡槽避免被 1 卡副本把集群切碎。 對接 UniRL 訓練任務一行環(huán)境變量搞定遠程面板最大的價值是讓訓練機的 GPU 全部留給 rollout 與訓練。訓練側(cè)由 unirl/reward/remote.py 的RemoteRewardBackend負責對接官方示例 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訓練時只需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)重聚合成訓練用的單一獎勵。 擴展指南4 步接入一個新打分器框架的擴展點設計得很克制網(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加對應條目name/scorer/runtime_env/num_gpus/num_replicas/params并補一個測試。已有子指標想擴新指標只需擴sub_metric_names元組并在score()返回的 dict 里加鍵——響應 schema 是 dict[str, float]天然多鍵協(xié)議不變。??一個硬邊界Rayruntime_env的隔離只到Python 包級不能換 Python 解釋器或 torch 底座worker 必須與集群同 Python 小版本。像genevalmmdet/mmcv 棧需要 Python 3.10這種跑不進本集群py3.12的打分器官方給了旁路方案在獨立 Python 3.10 主機上用 configs/geneval_service.yaml 單獨起一份服務再互調(diào)。? 進階技巧MPS 共享 GPU 與壓測CUDA MPS 省卡CLIP、PickScore、HPSv2、ImageReward 這類輕量打分器可以各占半張卡num_gpus: 0.5mps:塊服務會在 Ray 初始化前自動拉起本地 MPS 守護進程示例見 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ā)壓測服務起來后用 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)鍵文件速查表資料相對路徑服務總 README安裝/啟動/API 全表unirl-reward-service/README.md架構(gòu)與數(shù)據(jù)流設計文檔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訓練側(cè)遠程后端unirl/reward/remote.py遠程獎勵訓練 recipe 示例examples/diffusion/sd3/sd3_nft_reward_service.yaml多機 Ray 啟停腳本unirl-reward-service/scripts/ray_start.sh? 小結(jié)UniRL 獎勵服務的精髓是一個 FastAPI 網(wǎng)關(guān) N 個獨占 GPU 的 Ray 獎勵組 三重隔離單機三步即可上線一個多獎勵面板多機擴容只靠一行ray_address配置訓練側(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ā)白、偏色一次解決G Helper 屏幕色彩修復實操指南華碩筆記本發(fā)白、偏色一次解決 G Helper 是華碩游戲本上 Armoury Crate 的輕量替代方案它的屏幕色彩桌面應用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ū)貢獻獎勵指南獎勵指南vanilla extract的社區(qū)貢獻獎勵指南獎勵指南 vanilla extract是一個基于TypeScript的零運行時樣式表解決方案Zero ru前端開發(fā)工具上一篇Mirah類型系統(tǒng)深度解析靜態(tài)類型與類型推斷的巧妙設計下一篇AWS SDK for Java 2.x 操作 Amazon CloudFront 實戰(zhàn)指南分發(fā)、簽名 URL/Cookie 與多租戶場景創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考