、Server 與數(shù)據(jù)科學(xué)依賴的精簡安裝方案)
MLflow Skinny 輕量級客戶端解析無 SQL 存儲(chǔ)、Server 與數(shù)據(jù)科學(xué)依賴的精簡安裝方案【免費(fèi)下載鏈接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ml/mlflow本文聚焦 MLflow 倉庫中mlflow-skinny這一輕量級 Python 發(fā)行包說明它與完整版mlflow包在依賴邊界、功能邊界上的差異并結(jié)合倉庫源碼與測試驗(yàn)證其安裝方式、可選依賴擴(kuò)展與遠(yuǎn)程 Tracking 配置。讀完本文你將掌握在資源受限環(huán)境邊緣設(shè)備、CI、瘦客戶端容器中部署 MLflow 客戶端的最佳實(shí)踐并理解其背后的構(gòu)建機(jī)制。什么是 mlflow-skinnymlflow-skinny是 MLflow 官方提供的一個(gè)輕量級 Python 包其定位在 libs/skinny/README_SKINNY.md 中表述得很明確它是不包含SQL 存儲(chǔ)SQL storage、Server、UI 以及數(shù)據(jù)科學(xué)data science依賴的精簡 MLflow 包。也就是說它保留了 MLflow 的客戶端能力與 API 骨架但去掉了運(yùn)行完整平臺(tái)所必需的重型組件從而顯著降低安裝體積與依賴沖突風(fēng)險(xiǎn)。它的核心價(jià)值在于解決一類典型問題在只需要上報(bào)實(shí)驗(yàn)數(shù)據(jù)、讀寫模型注冊表的場景中不需要完整安裝一套帶 Web UI、帶數(shù)據(jù)庫遷移、帶各種數(shù)據(jù)科學(xué)庫的 MLflow。使用mlflow-skinny可以把依賴面壓縮到最小同時(shí)保持與完整 MLflow 相同的 Python API 使用方式。與完整版 mlflow 的依賴邊界從倉庫的構(gòu)建腳本 dev/pyproject.py 可以看出MLflow 的發(fā)行包分為多個(gè)類型SKINNY、RELEASE、DEV、TRACING其中 RELEASE 類型的完整包依賴聲明為fmlflow-skinny{package_version}, fmlflow-tracing{package_version}, ] sorted(core_requirements)即完整版mlflow包本身就強(qiáng)制依賴mlflow-skinny與mlflow-tracing再疊加 requirements/core-requirements.yaml 中的核心組件。對比這兩個(gè)依賴清單可以清晰看到完整版多出的是能力域完整版額外引入的依賴core-requirements元數(shù)據(jù)存儲(chǔ)與遷移alembic、sqlalchemyServing 與 Web 框架flask、flask-cors、gunicorn、waitress數(shù)據(jù)科學(xué)與模型numpy、scipy、pandas、scikit-learn、skops、pyarrow、matplotlib項(xiàng)目執(zhí)行后端docker、huey、aiohttp安全cryptography而這些正是mlflow-skinny刻意排除的。從源碼結(jié)構(gòu)看mlflow-skinny僅保留 RESTful 客戶端所需的 Tracking / Model Registry 通信能力、Project 在本地后端與 Databricks 上的執(zhí)行支持以及 Tracing 相關(guān)的基礎(chǔ)設(shè)施依賴。mlflow-skinny 的核心依賴清單mlflow-skinny的依賴由 requirements/skinny-requirements.yaml 定義并經(jīng)過構(gòu)建腳本生成到 libs/skinny/pyproject.toml 中。當(dāng)前版本的主要運(yùn)行時(shí)依賴及版本約束如下依賴版本約束來自 pyproject.toml用途anyio3.6.2,5,!4.15.0異步支持被 server/fastapi_app 間接使用4.15.0 被排除因其破壞了 starlette WSGI 橋接click7.0,9MLflow CLI 入口cloudpickle4序列化python-dotenv0.19.0,2環(huán)境變量文件加載gitpython3.1.9,4Project 執(zhí)行時(shí) git 操作pyyaml5.1,7YAML 解析MLproject 等protobuf3.12.0,8與 MLflow 服務(wù)端通信的 proto 消息requests2.17.3,3REST 客戶端packaging27版本解析importlib_metadata3.7.0,10,!4.7.0模型依賴自動(dòng)探測依賴packages_distributionssqlparse0.4.0,1SQL 解析基礎(chǔ)cachetools5.0.0,8Tracing 所需opentelemetry-api/sdk/proto1.9.0,3Tracing 基礎(chǔ)設(shè)施NoOpTracer 自 1.9.0 引入databricks-sdk0.20.0,1Databricks 集成pydantic2.0.0,3數(shù)據(jù)校驗(yàn)fastapi/starlette/uvicorn1/2/1輕量 ASGI 服務(wù)能力值得注意的細(xì)節(jié)是skinny-requirements.yaml中特意注明opentelemetry-api的 1.9.0 下限是因?yàn)镹oOpTracer從該版本才引入importlib_metadata的 3.7.0 下限則是因?yàn)槟P鸵蕾囎詣?dòng)探測依賴其packages_distributions函數(shù)。這些注釋體現(xiàn)了依賴版本約束是經(jīng)過嚴(yán)格驗(yàn)證的并非隨意填寫。構(gòu)建腳本 dev/pyproject.py 中還有一個(gè)關(guān)鍵校驗(yàn)函數(shù)_check_skinny_tracing_mismatch它強(qiáng)制要求tracing 的依賴必須是 skinny 依賴的子集if diff : set(tracing_reqs) - set(skinny_reqs): raise RuntimeError(Tracing requirements must be a subset of skinny requirements...)之所以做這個(gè)約束是因?yàn)閙lflow-skinny不會(huì)把mlflow-tracing設(shè)為硬依賴但必須保證 tracing 所需的依賴已被 skinny 覆蓋二者才能協(xié)同工作。安裝 mlflow-skinny方式一從本地倉庫安裝如果你已經(jīng)克隆了本倉庫可以直接指定libs/skinny子目錄進(jìn)行安裝參見 libs/skinny/README.mdpip install ./libs/skinny方式二從遠(yuǎn)程倉庫子目錄安裝pip install githttps://github.com/mlflow/mlflow.git#subdirectorylibs/skinny方式三官方一鍵腳本從 master / 分支 / PR 安裝倉庫提供了 dev/install-skinny.sh使用 git sparse-checkout 只拉取構(gòu)建所需的目錄/mlflow、/libs/skinny、/pyproject.toml并排除mlflow/server/js前端代碼避免下載整個(gè)倉庫# 安裝 master 最新版 curl -LsSf https://raw.githubusercontent.com/mlflow/mlflow/HEAD/dev/install-skinny.sh | sh # 安裝指定分支 curl -LsSf https://raw.githubusercontent.com/mlflow/mlflow/HEAD/dev/install-skinny.sh | sh -s branch # 安裝指定 PR curl -LsSf https://raw.githubusercontent.com/mlflow/mlflow/HEAD/dev/install-skinny.sh | sh -s pull/pr_num/merge安裝的源碼級保障symlink 與構(gòu)建守衛(wèi)libs/skinny/mlflow是指向倉庫根目錄mlflow包的符號(hào)鏈接symlink。倉庫中的 libs/skinny/setup.py 專門為此實(shí)現(xiàn)了一個(gè)構(gòu)建期守衛(wèi)在 Windows 上若未開啟開發(fā)者模式git 會(huì)把 symlink 物化為普通文本文件setuptools將找不到任何包從而構(gòu)建出一個(gè)能裝上、能聲明mlflow命令入口、卻無法 import 任何內(nèi)容的空 wheel。因此 setup.py 在構(gòu)建時(shí)檢查if not (Path(__file__).parent / mlflow).is_dir(): raise SystemExit( libs/skinny/mlflow is not a directory, so this build would produce a wheel with no code in it.\n On Windows, git materializes symlinks as text files unless you enable Developer Mode, or clone with:\n git -c core.symlinkstrue clone https://github.com/mlflow/mlflow )也就是說在 Windows 上克隆倉庫后想本地安裝請使用git -c core.symlinkstrue clone ...或啟用 Developer Mode。按需擴(kuò)展為缺失功能補(bǔ)充依賴由于mlflow-skinny刻意不攜帶重型依賴使用其擴(kuò)展功能時(shí)需按需安裝相應(yīng)組件。官方 README 明確給出了三類典型場景同樣可在 dev/pyproject.py 的SKINNY_README模板中看到對應(yīng)原文想要使用的功能需要額外安裝的依賴mlflow.sklearn等 MLflow Models 組件scikit-learn、numpy、pandasSQL 元數(shù)據(jù)存儲(chǔ)如 SQLite/MySQL/PostgreSQL 后端sqlalchemy、alembic、sqlparseServing 相關(guān)特性flask、pandas此外libs/skinny/pyproject.toml 還聲明了豐富的一鍵可選依賴組extras安裝時(shí)可以用pip install mlflow-skinny[extras]之類的形式一次性補(bǔ)齊extraspyarrow、boto3、botocore、google-cloud-storage、azureml-core、pysftp、kubernetes、prometheus-flask-exporter 等——覆蓋 S3 / GCS / Azure / SFTP 等各云廠商制品存儲(chǔ)與 Kubernetes 遠(yuǎn)程項(xiàng)目執(zhí)行dbPyMySQL、psycopg2-binary、pymssql——MySQL / PostgreSQL / SQL Server 數(shù)據(jù)庫驅(qū)動(dòng)databricksdatabricks-agents 及云存儲(chǔ) SDK——Databricks 場景專用gateway/genaiboto3、slowapi、tiktoken、uvicorn[standard]、watchfiles——AI Gateway 與 GenAI 功能mcpfastmcp、click——MCP 協(xié)議支持azureazure-storage-blob、azure-identitysqlservermlflow-dbstorealiyun-ossaliyunstoreplugin阿里云 OSS 插件jfrogmlflow-jfrog-pluginkuberneteskuberneteslangchainlangchain版本范圍由ml-package-versions.yml自動(dòng)推導(dǎo)authFlask-WTF——basic auth 認(rèn)證。這些 extras 與完整版mlflow包的可選依賴體系保持一致用戶可以在極簡客戶端和全功能平臺(tái)之間按需取用。遠(yuǎn)程 Tracking 配置瘦客戶端的正確用法重要注意事項(xiàng)官方原文強(qiáng)調(diào)使用mlflow-skinny時(shí)由于它不包含 Server / UI / SQL 存儲(chǔ)必須將 Tracking URI 設(shè)置為遠(yuǎn)程 MLflow 服務(wù)器而不是默認(rèn)的本地文件存儲(chǔ)export MLFLOW_TRACKING_URIhttp://your-mlflow-server:5000該環(huán)境變量在 mlflow/environment_variables.py 中有正式定義MLFLOW_TRACKING_URI _EnvironmentVariable(MLFLOW_TRACKING_URI, str, None)在代碼中也可以等價(jià)地使用import mlflow mlflow.set_tracking_uri(http://your-mlflow-server:5000)在瘦客戶端模式下MLflow 通過 HTTP REST 與遠(yuǎn)端 Tracking Service / Model Registry 通信因此requests是這個(gè)包的骨干依賴之一。這一架構(gòu)意味著你可以在邊緣節(jié)點(diǎn)、CI 流水線或內(nèi)網(wǎng)受控容器中安裝mlflow-skinny把數(shù)據(jù)上報(bào)到集中部署的 MLflow Server實(shí)現(xiàn)客戶端極簡、服務(wù)端集中的拓?fù)?。源碼與測試如何驗(yàn)證瘦客戶端邊界倉庫的測試套件直接驗(yàn)證了瘦客戶端的依賴邊界。在 tests/test_skinny_client_omits_data_science_libs.py 中測試首先檢查環(huán)境變量MLFLOW_SKINNY是否存在不存在則跳過隨后斷言在 import mlflow 之后flask、pandas、numpy均無法導(dǎo)入def test_fails_import_flask(): import mlflow # noqa: F401 with pytest.raises(ImportError, matchflask): import flask # noqa: F401這從測試層面確認(rèn)了mlflow-skinny安裝后不會(huì)把數(shù)據(jù)科學(xué)庫連帶裝進(jìn)來這正是它體積小的根本原因。同類測試還包括 tests/test_skinny_client_omits_sql_libs.py驗(yàn)證 SQL 庫被省略與 tests/test_skinny_client_anthropic_import.py驗(yàn)證瘦客戶端對可選 flavor 的延遲導(dǎo)入策略。此外倉庫還維護(hù)了版本一致性約束RELEASE 構(gòu)建會(huì)強(qiáng)制mlflow、mlflow-skinny、mlflow-tracing三個(gè)包版本號(hào)嚴(yán)格對齊mlflow-skinny{package_version}配合_check_skinny_tracing_mismatch校驗(yàn)保證三個(gè)子包不會(huì)出現(xiàn)依賴漂移。版本發(fā)布與構(gòu)建機(jī)制進(jìn)階原理從 dev/pyproject.py 可以梳理出mlflow-skinny的完整構(gòu)建鏈路依賴源頭mlflow/version.py中的VERSION字符串、requirements/skinny-requirements.yaml、requirements/tracing-requirements.yaml、requirements/core-requirements.yaml、.python-version文件構(gòu)建腳本對四個(gè)包類型分別組裝依賴列表其中 SKINNY 類型直接使用sorted(skinny_requirements)生成物包括 libs/skinny/pyproject.tomlPEP 621 元數(shù)據(jù)與README_SKINNY.md即本文所依據(jù)的文檔本體二者均標(biāo)注 Autogenerated by dev/pyproject.py. Do not edit manually手工修改會(huì)被腳本覆蓋發(fā)布時(shí)完整版mlflow包的 pyproject 會(huì)被 pyproject.release.toml 替換把mlflow-skinny與mlflow-tracing作為硬依賴引入實(shí)現(xiàn)三個(gè)包的同版本發(fā)布。因此mlflow-skinny不是一個(gè)另起爐灶的分支而是 MLflow 官方同一份源碼、多種打包形態(tài)的產(chǎn)物——它的代碼與完整版完全同源只是依賴裁剪策略不同。何時(shí)選擇 mlflow-skinny綜合上述分析mlflow-skinny適合以下場景邊緣 / 嵌入式環(huán)境資源受限設(shè)備上需要上報(bào)實(shí)驗(yàn)數(shù)據(jù)但無法承受 pandas、scikit-learn 等重型依賴CI / 測試流水線只想快速驗(yàn)證 Tracking 客戶端邏輯不必安裝完整平臺(tái)瘦客戶端容器作為獨(dú)立進(jìn)程或 job 運(yùn)行與集中式 MLflow Server 通過 REST 通信對體積敏感的分發(fā)場景需要把 MLflow 客戶端能力打進(jìn)體積敏感的分發(fā)包中。反之如果需要本地運(yùn)行mlflow server、瀏覽 UI、使用本地 SQL 存儲(chǔ)或本地模型 Serving則應(yīng)安裝完整版mlflow包它本身也會(huì)帶上mlflow-skinny與mlflow-tracing無需重復(fù)安裝。延伸閱讀libs/skinny/README_SKINNY.md本文檔本體mlflow-skinny 包的官方描述PyPI 上的 readmelibs/skinny/pyproject.tomlmlflow-skinny 的完整包元數(shù)據(jù)、依賴與可選依賴組libs/skinny/setup.pysymlink 構(gòu)建守衛(wèi)解釋 Windows 下安裝的坑requirements/skinny-requirements.yamlskinny 依賴的唯一事實(shí)來源dev/pyproject.py生成 pyproject.toml 與 README_SKINNY.md 的自動(dòng)化腳本tests/test_skinny_client_omits_data_science_libs.py驗(yàn)證瘦客戶端排除數(shù)據(jù)科學(xué)依賴的測試用例mlflow/environment_variables.pyMLFLOW_TRACKING_URI等環(huán)境變量定義?!久赓M(fèi)下載鏈接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ml/mlflow創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考