指南:通過參數(shù)化靈活配置 Serve 應用)
人工智能分布式訓練強化學習任務調(diào)度模型推理服務【免費下載鏈接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.項目地址https://gitcode.com/gh_mirrors/ra/ray點擊查看免費下載導讀在 Ray Serve 中應用構建器application builder是連接部署代碼與部署配置的橋梁它將一個接收參數(shù)字典或 Pydantic 模型的普通 Python 函數(shù)變成 Serve 應用的工廠從而讓你無需修改代碼即可通過serve run命令行或 YAML 配置文件動態(tài)傳入模型權重路徑、超參數(shù)等配置。讀完本文你將掌握如何定義無類型與帶類型的應用構建器、如何通過 CLI 和配置文件兩種方式傳參、如何使用 Pydantic 做參數(shù)校驗以及如何利用同一構建器派生多個參數(shù)化應用和組合多個 Deployment 的實戰(zhàn)模式。本文對應的倉庫文檔為 app-builder-guide.md完整示例代碼見 app_builder.py。為什么需要應用構建器從.bind()到參數(shù)化在 Ray Serve 中一個應用Application是由一個或多個 Deployment 通過.bind()組合而成的。當應用存在可變參數(shù)時——例如trained model weights 的路徑、要打印的消息、模型推理的超參數(shù)——最常見的做法是直接在 Python 代碼里把這些參數(shù)傳給 Deployment 的構造函數(shù)from ray import serve serve.deployment class HelloWorld: def __init__(self, message: str): self._message message HelloWorld.bind(Hello from code)這種寫法用普通 Python 代碼完成配置簡單直觀。但它的缺點是每當參數(shù)需要變化就必須修改并重新部署代碼。在開發(fā)想快速試一個新訓練的模型和生產(chǎn)同一份代碼服務多個模型版本場景下這都不可接受。應用構建器正是為消除這一痛點而生的它定義一個builder 函數(shù)接收一個參數(shù)字典或 Pydantic 對象返回構建好的Application。之后參數(shù)可以從serve run命令行或配置文件外部注入代碼本身保持零改動。從源碼看這一機制的核心入口是 python/ray/serve/_private/api.py 中的call_user_app_builder_with_args_if_necessary()當傳入的 builder 是函數(shù)而非已構建好的Application時它會校驗函數(shù)簽名、把參數(shù)字典轉(zhuǎn)換為用戶標注的 Pydantic 模型如果存在調(diào)用函數(shù)并強制校驗返回值為Application類型。定義一個應用構建器最簡單的應用構建器是一個接收Dict[str, str]并返回Application的普通函數(shù)。以下示例來自 doc/source/serve/doc_code/app_builder.py將代碼保存為hello.py# hello.py from typing import Dict from ray import serve from ray.serve import Application serve.deployment class HelloWorld: def __init__(self, message: str): self._message message print(Message:, self._message) def __call__(self, request): return self._message def app_builder(args: Dict[str, str]) - Application: return HelloWorld.bind(args[message])關鍵點函數(shù)簽名builder 必須且只能接收一個參數(shù)。從源碼 python/ray/serve/_private/api.py 可見Ray 會通過inspect.signature檢查參數(shù)個數(shù)若不是恰好一個參數(shù)會拋出TypeError提示 Application builder functions should take exactly one parameter...。返回類型builder 的返回值必須是Deployment.bind()產(chǎn)生的Application實例否則同樣會拋出TypeError見 api.py。參數(shù)讀取在無類型 builder 中args就是外部傳入的字符串字典取值后傳給HelloWorld.bind(...)作為構造函數(shù)參數(shù)。把這個 builder 函數(shù)的名字模塊路徑hello:app_builder作為serve run的 import path 或配置文件中的import_path即可由外部注入?yún)?shù)。若要避免手寫類型轉(zhuǎn)換和缺參校驗邏輯推薦直接使用下文用 Pydantic 給參數(shù)定義類型一節(jié)中的帶類型寫法。關于傳入?yún)?shù)為字典的說明CLI 傳入的keyval參數(shù)會被解析成普通字典config 文件中的args字段同理。參數(shù)在構建時被解析并傳給 builder你可以把任意 JSON 可序列化的值放進 config 的args中注意CLI 方式下所有值都是字符串config 方式則保留 YAML 的類型語義。通過serve run命令行傳參在serve run中import path 之后以keyval的形式傳入?yún)?shù)serve run hello:app_builder key1val1 key2val2參數(shù)會被收集為一個字典傳遞給 builder即上面命令等價于傳入{key1: val1, key2: val2}。例如給上面hello.py中的HelloWorld應用傳一條新消息% serve run hello:app_builder messageHello from CLI 2023-05-16 10:47:31,641 INFO scripts.py:404 -- Running import path: hello:app_builder. 2023-05-16 10:47:33,344 INFO worker.py:1615 -- Started a local Ray instance. View the dashboard at http://127.0.0.1:8265 (ServeController pid56826) INFO 2023-05-16 10:47:35,115 controller 56826 deployment_state.py:1244 - Deploying new version of deployment default_HelloWorld. (ServeController pid56826) INFO 2023-05-16 10:47:35,141 controller 56826 deployment_state.py:1483 - Adding 1 replica to deployment default_HelloWorld. (ProxyActor pid56828) INFO: Started server process [56828] (ServeReplica:default_HelloWorld pid56830) Message: Hello from CLI 2023-05-16 10:47:36,131 SUCC scripts.py:424 -- Deployed Serve app successfully.注意日志中(ServeReplica:default_HelloWorld pid56830) Message: Hello from CLI——消息從 Deployment 構造函數(shù)中打印出來證明參數(shù)確實被注入到了部署內(nèi)部。CLI 側(cè)的參數(shù)解析實現(xiàn)位于 python/ray/serve/scripts.py 的convert_args_to_dict()def convert_args_to_dict(args: Tuple[str]) - Dict[str, str]: args_dict dict() for arg in args: split arg.split(, maxsplit1) if len(split) ! 2 or len(split[1]) 0: raise click.ClickException( fInvalid application argument {arg}, must be of the form keyval. ) args_dict[split[0]] split[1] return args_dict幾點實用提示參數(shù)必須以分隔鍵值且值不能為空字符串否則會報Invalid application argument錯誤使用maxsplit1切分因此值中允許包含字符如model_uris3://bucket/pathv2中的會被保留在值里CLI 方式下所有參數(shù)值都是字符串需要整數(shù)/布爾等類型時應在 builder 內(nèi)自行轉(zhuǎn)換或者改用 Pydantic 類型化 builder 自動完成轉(zhuǎn)換。通過配置文件傳參除了 CLI也可以在 Serve 部署配置文件的args字段中傳參applications: - name: MyApp import_path: hello:app_builder args: message: Hello from configargs字段的定義見 python/ray/serve/schema.py它屬于ApplicationConfigPydantic 模型類型為Dict默認值為{}其字段描述即Arguments that will be passed to the application builder.。運行配置文件的命令及輸出% serve run config.yaml 2023-05-16 10:49:25,247 INFO scripts.py:351 -- Running config file: config.yaml. 2023-05-16 10:49:26,949 INFO worker.py:1615 -- Started a local Ray instance. View the dashboard at http://127.0.0.1:8265 2023-05-16 10:49:28,678 SUCC scripts.py:419 -- Submitted deploy config successfully. (ServeController pid57109) INFO 2023-05-16 10:49:28,676 controller 57109 controller.py:559 - Building application MyApp. (ProxyActor pid57111) INFO: Started server process [57111] (ServeController pid57109) INFO 2023-05-16 10:49:28,940 controller 57109 application_state.py:202 - Built application MyApp successfully. (ServeController pid57109) INFO 2023-05-16 10:49:28,942 controller 57109 deployment_state.py:1244 - Deploying new version of deployment MyApp_HelloWorld. (ServeController pid57109) INFO 2023-05-16 10:49:29,016 controller 57109 deployment_state.py:1483 - Adding 1 replica to deployment MyApp_HelloWorld. (ServeReplica:MyApp_HelloWorld pid57113) Message: Hello from config與 CLI 方式對比維度serve run傳參配置文件傳參參數(shù)格式命令行keyvalYAML 的args字段值類型全部為字符串保留 YAML 類型int、bool、list、dict 等適用場景快速開發(fā)、臨時測試生產(chǎn)部署、版本管理、多應用編排部署方式直接以 import path 運行先經(jīng)serve deploy/serve run config.yaml提交配置與 CLI 傳參共享的底層路徑兩種方式最終殊途同歸serve run在 scripts.py 中把 CLI 參數(shù)解析成字典后調(diào)用call_user_app_builder_with_args_if_necessary()config 文件方式則在 ServeController 構建應用時以相同路徑處理。也就是說無論參數(shù)來自命令行還是 YAMLbuilder 函數(shù)接收到的都是同一個字典后續(xù)校驗和調(diào)用邏輯完全一致。用 Pydantic 給參數(shù)定義類型Pydantic v1 棄用提醒注意Pydantic v1 已被棄用Ray 將在版本 2.56 中移除對它的支持。如果你還在使用 Pydantic v1請通過pip install -U pydantic升級到 Pydantic v2。詳見相關 issue 說明。類型化 builder 的定義手寫args[message]這種取值方式需要自己處理缺參、類型轉(zhuǎn)換等問題。更優(yōu)雅的做法是定義一個 Pydantic 模型并把它作為 builder唯一參數(shù)的類型注解# hello.py from pydantic import BaseModel from ray import serve from ray.serve import Application class HelloWorldArgs(BaseModel): message: str serve.deployment class HelloWorld: def __init__(self, message: str): self._message message print(Message:, self._message) def __call__(self, request): return self._message def typed_app_builder(args: HelloWorldArgs) - Application: return HelloWorld.bind(args.message)使用方法與無類型版本完全一致參數(shù)傳遞方式不變% serve run hello:typed_app_builder messageHello from CLI 2023-05-16 10:47:31,641 INFO scripts.py:404 -- Running import path: hello:typed_app_builder. 2023-05-16 10:47:33,344 INFO worker.py:1615 -- Started a local Ray instance. View the dashboard at http://127.0.0.1:8265 (ServeController pid56826) INFO 2023-05-16 10:47:35,115 controller 56826 deployment_state.py:1244 - Deploying new version of deployment default_HelloWorld. (ServeController pid56826) INFO 2023-05-16 10:47:35,141 controller 56826 deployment_state.py:1483 - Adding 1 replica to deployment default_HelloWorld. (ProxyActor pid56828) INFO: Started server process [56828] (ServeReplica:default_HelloWorld pid56830) Message: Hello from CLI 2023-05-16 10:47:36,131 SUCC scripts.py:424 -- Deployed Serve app successfully.底層原理Pydantic 自動校驗Ray 會檢測 builder 唯一參數(shù)的類型注解若它是BaseModel的子類就把傳入的參數(shù)字典交給 Pydantic 構造模型實例。當前版本使用model_validate()Pydantic v2 語義相關代碼見 python/ray/serve/_private/api.py# If the sole argument to the builder is a pydantic model, convert the args dict to # that model. This will perform standard pydantic validation (e.g., raise an # exception if required fields are missing). param signature.parameters[list(signature.parameters.keys())[0]] if inspect.isclass(param.annotation) and issubclass(param.annotation, BaseModel): args param.annotation.model_validate(args)這意味著你免費獲得的能力包括必填字段校驗HelloWorldArgs中的message沒有默認值若外部漏傳Pydantic 會拋出ValidationError構建立即失敗而不是等到運行時才暴露問題類型轉(zhuǎn)換與校驗例如字段聲明為intCLI 傳入的字符串42會被自動轉(zhuǎn)成整數(shù)非法值如abc會被拒絕默認值給字段設置默認值即可實現(xiàn)可選參數(shù)缺省時自動填充嵌套與復雜類型字段可以是List、Dict、嵌套的 Pydantic 模型等適用于復雜的配置結構。利用這些能力參數(shù)定義本身就成了應用的配置契約schema比手寫if key not in args之類的防御代碼更可靠、更易維護。實戰(zhàn)模式一同一構建器派生多個參數(shù)化應用在生產(chǎn)中最常見的需求是一份代碼多個配置多個應用共享同樣的預處理與 HTTP 處理邏輯但各自加載不同的模型權重。此時可以把同一個 builder 的 import path 配合不同args寫出多個應用條目applications: - name: Model1 import_path: my_module:my_model_code args: model_uri: s3://my_bucket/model_1 - name: Model2 import_path: my_module:my_model_code args: model_uri: s3://my_bucket/model_2 - name: Model3 import_path: my_module:my_model_code args: model_uri: s3://my_bucket/model_3其中my_model_code是my_module中的一個應用構建器函數(shù)它接收model_uri參數(shù)并返回加載對應權重的應用。三個應用共用同一份代碼只是參數(shù)不同。這種模式的好處模型版本切換零代碼改動要換模型只需改 YAML 中的model_uri重新部署即可多模型并存同一集群內(nèi)可同時部署多個模型實例各自獨立路由對應多應用部署參見 multi-app.md配置可版本化應用清單可以放進 Git 做版本管理便于審計與回滾。實戰(zhàn)模式二用參數(shù)配置多個組合 Deployment應用構建器接收的參數(shù)不僅可以傳給單個 Deployment還可以用來配置一個應用內(nèi)多個 Deployment 的組合關系。例如一個模型組合model composition應用需要兩個模型的權重就可以在參數(shù)里同時聲明兩條 URI# 完整示例見 doc/source/serve/doc_code/app_builder.py 的 composed_app_builder from pydantic import BaseModel from ray.serve import Application class ComposedArgs(BaseModel): model1_uri: str model2_uri: str def composed_app_builder(args: ComposedArgs) - Application: return IngressDeployment.bind( Model1.bind(args.model1_uri), Model2.bind(args.model2_uri), )此時配置文件中只需傳兩個參數(shù)即可驅(qū)動整條調(diào)用鏈applications: - name: ComposedApp import_path: my_module:composed_app_builder args: model1_uri: s3://my_bucket/model_a model2_uri: s3://my_bucket/model_bIngressDeployment.bind(Model1.bind(...), Model2.bind(...))會構建一個由入口 Deployment 與兩個模型 Deployment 組成的應用 DAG。由于ComposedArgs的兩個字段都沒有默認值任何缺失都會在構建階段被 Pydantic 攔截報錯。這正是參數(shù)集中管理 部署結構靈活組裝的組合威力參數(shù)變化換模型與結構變化改組合邏輯被清晰分離。使用注意事項與最佳實踐builder 只接收一個參數(shù)Ray 強制 builder 恰好只有一個參數(shù)。想傳多個配置項時把它們放進同一個字典/Pydantic 模型即可Pydantic 模型天然支持任意數(shù)量的字段。返回值必須是Applicationbuilder 必須以Deployment.bind()的返回值返回不能返回 Deployment 或裸函數(shù)。不要對已構建好的 Application 傳參如果 import path 指向的不是 builder 函數(shù)而是已構建的Application對象再傳任何參數(shù)都會觸發(fā) api.py 中的ValueErrorArguments can only be passed to an application builder function, not an already built application.。CLI 值都是字符串CLI 傳參時值一律是字符串需要數(shù)字或布爾值時要么在 builder 里轉(zhuǎn)換要么用 Pydantic 字段類型自動轉(zhuǎn)換推薦要么改用配置文件傳參以保留 YAML 原生類型。優(yōu)先使用 Pydantic 類型化 builder它能替你完成缺參校驗、類型轉(zhuǎn)換和默認值處理減少手寫解析邏輯同時把參數(shù)契約顯式化方便團隊協(xié)作與文檔生成。生產(chǎn)環(huán)境推薦配置文件方式CLI 適合開發(fā)調(diào)試生產(chǎn)部署建議把args寫進 YAML 配置清單配合serve deploy做聲明式、可版本化的部署參見 develop-and-deploy.md 與 production-guide。參數(shù)變更觸發(fā)滾動更新修改args后重新部署ServeController 會為相關 Deployment 構建新版本并替換副本日志中的 Deploying new version of deployment ... 即此過程無需手工刪除舊部署。小結應用構建器把代碼與配置解耦serve run hello:app_builder message...適合開發(fā)期快速迭代config.yaml的args字段適合生產(chǎn)期聲明式部署無類型 builder 簡單直接Pydantic 類型化 builder 則提供開箱即用的校驗與類型轉(zhuǎn)換。結合同一 builder 多參數(shù)多應用多 Deployment 組合配置兩個實戰(zhàn)模式你可以用一份代碼靈活支撐多個模型版本與多種組合拓撲這正是 Ray Serve 生產(chǎn)化部署的核心能力之一。更多進階主題可繼續(xù)閱讀倉庫中的 autoscaling-guide.md、model-composition 文檔 與 http-guide.md。贊分享人工智能分布式訓練強化學習任務調(diào)度模型推理服務【免費下載鏈接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.項目地址https://gitcode.com/gh_mirrors/ra/ray點擊查看免費下載相關推薦Ray項目應用構建指南如何優(yōu)雅傳遞參數(shù)到Serve應用Ray項目應用構建指南如何優(yōu)雅傳遞參數(shù)到Serve應用 引言 在構建分布式應用時參數(shù)配置是一個常見但容易被忽視的重要環(huán)節(jié)。Ray Serve作為Ray項目的人工智能分布式訓練強化學習任務調(diào)度模型推理服務Ray Serve 多應用部署指南用多應用配置在單集群上部署與管理多個獨立 Serve 應用Ray Serve 多應用部署指南用多應用配置在單集群上部署與管理多個獨立 Serve 應用 本指南以 Ray Serve 的多應用multi applic人工智能分布式訓練強化學習任務調(diào)度模型推理服務Ray Serve 項目教程構建流式響應的聊天機器人應用Ray Serve 項目教程構建流式響應的聊天機器人應用 概述 本教程將介紹如何使用 Ray Serve 框架構建支持流式輸入輸出的聊天機器人應用。我們將通過人工智能分布式訓練強化學習任務調(diào)度模型推理服務創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考