Xinference本地大模型部署:统一API与多模型服务总线

发布时间:2026/6/13 14:20:06

Xinference本地大模型部署:统一API与多模型服务总线 1. 项目概述为什么本地部署大模型需要 Xinference 这个“中间件”最近三个月我帮六家不同行业的客户落地了本地大模型服务——有做工业设备故障诊断的制造企业有要处理内部法律合同的律所还有想把客服知识库跑在私有云上的电商公司。他们提得最多的问题不是“哪个模型最强”而是“怎么让一个 7B 参数的 Qwen 或者 13B 的 Llama3在我们自己的服务器上稳稳当当地跑起来还能被现有业务系统调用”——这恰恰是 Xinference 最擅长的事。它不训练模型也不写前端界面而是专注解决“模型部署最后一公里”的工程问题统一接口、资源调度、模型生命周期管理、多模型并行加载。你可以把它理解成大模型世界的 Nginx Docker Compose Model Zoo 三合一工具Nginx 负责把 HTTP/gRPC 请求路由到正确的模型实例Docker Compose 负责一键拉起、挂载显存、设置 batch sizeModel Zoo 则内置了对 Hugging Face 上千个主流开源模型的自动适配逻辑连trust_remote_codeTrue这种坑都帮你预判好了。关键词里反复出现的 “Deploying Models” 不是泛泛而谈的“部署”而是特指那种需要支撑生产级 API 调用、支持模型热切换、能监控 GPU 显存占用、且不依赖云厂商封闭生态的本地化部署。它适合两类人一类是 DevOps 工程师手头有几台 A10 或 3090 服务器但不想从零写 FastAPI 接口、手动管理 CUDA 环境另一类是算法研究员刚在本地微调完一个医疗问答模型急需一个“开箱即用”的服务层好让临床系统工程师直接调用http://localhost:9997/v1/chat/completions。Xinference 的价值不在炫技而在把“让模型跑起来”这件事从需要写 200 行胶水代码的苦差变成一条命令加一个 YAML 配置就能交付的标准化动作。2. 核心设计思路与方案选型逻辑2.1 为什么不是直接用 Transformers FastAPI——直面工程现实的取舍很多初学者的第一反应是既然 Hugging Face Transformers 已经能加载模型FastAPI 又能写 API那自己搭一个不就行了我试过而且不止一次。去年给一家医疗器械公司部署 Qwen2-7B-Instruct 时我就走了这条路。结果在真实场景中暴露出三个硬伤第一显存泄漏。FastAPI 默认的异步 worker 模式和 PyTorch 的 CUDA 上下文管理存在冲突连续请求 500 次后A10 显存占用从 8GB 涨到 12GB最后 OOM 崩溃第二模型冷启动慢。每次新请求进来如果模型没预热首次响应要等 8~12 秒——这对客服系统是不可接受的第三多模型切换成本高。客户要求同时提供“中文医疗问答”和“英文文献摘要”两个模型自己写的调度器在模型卸载时经常卡死必须重启整个服务。Xinference 的设计恰恰是针对这些痛点来的它用独立的xinference-worker进程管理每个模型实例进程间内存隔离彻底规避显存泄漏它强制要求模型启动时完成全部权重加载和 KV Cache 初始化冷启动时间虽略长约 15~20 秒但后续所有请求都是毫秒级响应它内置的xinference-supervisor进程则像一个轻量级 Kubernetes负责监听模型状态、自动拉起失败实例、按需分配 GPU 设备号。这不是过度设计而是把三年来上百个真实部署案例踩过的坑固化成了架构基因。2.2 为什么不是 vLLM 或 Text Generation InferenceTGI——定位差异决定技术选型vLLM 和 TGI 是当前最火的两个高性能推理框架尤其 vLLM 的 PagedAttention 技术能把吞吐量拉到极致。但它们和 Xinference 的定位有本质区别vLLM 是“单模型极致优化引擎”TGI 是“Hugging Face 模型专用服务框架”而 Xinference 是“多模型统一服务总线”。举个具体例子客户现场有一台双卡 A10 服务器需要同时运行一个 7B 的 CodeLlama用于代码补全和一个 3B 的 TinyLlama用于内部文档摘要。用 vLLM你得为每张卡单独启一个服务再自己写负载均衡用 TGI它默认只支持text-generation类任务对chat、embedding、rerank这些新类型支持弱且不提供跨模型的统一 API。Xinference 则原生支持“一机多模”你只需在配置文件里声明model_uid: code-assistant model_name: codellama-7b-instruct device: cuda:0 model_uid: doc-summarizer model_name: tinyllama-3b-chat device: cuda:1它会自动在 cuda:0 启动第一个 worker在 cuda:1 启动第二个并通过同一个/v1/chat/completions接口根据请求头里的model字段路由到对应实例。更关键的是Xinference 的 API 完全兼容 OpenAI 标准这意味着你现有的 Python 脚本、Postman 测试集、甚至 LangChain 的ChatOpenAI类都不用改一行代码就能直接对接。这种“向后兼容性”在企业环境中比单纯提升 20% 吞吐量更重要——它降低了整个技术栈的迁移成本。2.3 为什么选择 Xinference 而非自研——成本与风险的硬核算有人会问既然 Xinference 开源那我们 fork 一份按自己需求魔改不就行了我做过详细测算。以支持国产算力平台如昇腾 910B为例Xinference 社区版目前尚未原生支持 AscendCL但它的插件机制非常清晰你只需要实现AscendInferenceModel类重写load_model()和forward()两个方法再注册进ModelSpec即可。我们团队花了 3 人日完成了这个适配测试稳定后直接 PR 回社区。但如果从零自研光是构建一套可热更新的模型注册中心、设计无状态的 API 网关、实现 GPU 显存用量实时上报保守估计要 3 个月。更隐蔽的风险在于生态断层Xinference 直接复用 Hugging Face 的snapshot_download能无缝下载.safetensors权重、自动解压分片、校验 SHA256而自研方案一旦遇到 HF 新增的revision分支或gguf量化格式就得紧急打补丁。Xinference 的核心价值是把“模型部署”这个领域共性问题变成了一个可维护、可审计、有社区兜底的标准化组件。在甲方验收时你说“我们用了 Xinference”对方技术负责人立刻明白这是行业通行方案如果说“我们自研了一套模型服务框架”对方第一反应是“哦那你们的 SLA 怎么保障”3. 核心细节解析与实操要点3.1 模型加载机制不只是from_pretrained而是“智能预检分级加载”Xinference 加载模型远非简单调用AutoModel.from_pretrained()。它有一套完整的预检流水线这是保证部署成功率的关键。当你执行xinference launch --model-name qwen2-7b-instruct时后台实际发生以下步骤元数据解析先读取内置的model_spec.json确认该模型属于chat类型支持system/user/assistant角色最大上下文长度为 32768硬件能力匹配检查本地 GPU 显存nvidia-smi输出若只有 16GB 显存则自动禁用flash_attn因该库在小显存下易崩溃并提示“建议启用quantization: awq”权重完整性校验调用hf_hub_download下载config.json和model.safetensors.index.json解析分片列表逐个校验每个.safetensors文件的 SHA256 是否与 HF 仓库一致动态量化决策若用户未指定--quantizationXinference 会根据模型参数量和显存余量自动推荐7B 模型在 24GB 显存下默认用bf16在 16GB 下推荐awq在 8GB 下强制gguf分阶段加载先加载config.json和 tokenizer验证apply_chat_template方法可用再加载model.safetensors主权重最后初始化KV Cache结构此时才真正占用显存。这个过程看似复杂但对用户完全透明。你唯一需要关注的是它给出的明确提示。比如在一台 309024GB上启动 Qwen2-7B你会看到终端输出[INFO] Loading model qwen2-7b-instruct with dtype bfloat16 on cuda:0 [INFO] Tokenizer loaded, vocab_size151936 [INFO] Model weights loaded (13.2GB of 13.2GB) [INFO] KV cache initialized for max_length32768 [SUCCESS] Model qwen2-7b-instruct is ready at http://localhost:9997这里每一行都是一个关键检查点。Model weights loaded (13.2GB of 13.2GB)这句特别重要——它告诉你实际加载的权重大小而非模型宣称的“7B 参数”。因为 7B 参数在bfloat16下理论占 14GB但 Qwen2 实际权重文件只有 13.2GB说明它做了结构精简。如果你看到13.2GB of 14.0GB就说明下载不完整必须中断重试。这是我踩过最深的坑某次因网络抖动model.safetensors缺失最后 2MBXinference 仍显示加载成功但首次推理时直接CUDA error: device-side assert triggered。所以我的实操心得第一条就是永远盯着这行日志确保“of”前后数字完全相等。3.2 API 兼容性设计如何让旧代码零修改对接新服务Xinference 的 OpenAI 兼容模式不是简单地把/chat/completions路由转发而是深度模拟了 OpenAI 的请求/响应体结构。我们来看一个真实对比原始 OpenAI 请求Pythonimport openai client openai.OpenAI(api_keysk-xxx, base_urlhttps://api.openai.com/v1) response client.chat.completions.create( modelgpt-3.5-turbo, messages[{role: user, content: 你好}], temperature0.7 ) print(response.choices[0].message.content)对接 Xinference 时只需改一行client openai.OpenAI(api_keynone, base_urlhttp://localhost:9997/v1) # 注意key 改为 noneurl 指向本地 # 后续代码完全不变为什么能这样因为 Xinference 在v1/chat/completions接口里做了三件事请求字段映射将 OpenAI 的temperature、top_p、max_tokens等参数精准转换为对应模型后端如transformers或llama-cpp-python的调用参数消息格式归一化无论你传入messages[{role:user,content:xxx}]还是messages[{role:system,content:xxx},{role:user,content:yyy}]它都会调用模型的apply_chat_template()方法生成符合该模型要求的 prompt 字符串如 Qwen 用|im_start|user\nxxx|im_end|Llama3 用|begin_of_text||start_header_id|user|end_header_id|\n\nxxx|eot_id|响应体严格对齐返回的 JSON 结构与 OpenAI 完全一致包括id、object、created、model、choices[0].message.role/content、usage.prompt_tokens/completion_tokens等所有字段。甚至usage中的 token 计数也是调用tiktoken库按模型名称精确计算的不是简单估算。这种兼容性带来的好处是立竿见影的。我们曾用这套方案把一个基于 LangChain 构建的金融研报分析系统从调用 Azure OpenAI 切换到本地 Xinference全程只改了 1 行环境变量OPENAI_BASE_URLhttp://localhost:9997/v1其他 3000 行代码、所有 Prompt Template、所有 Chain 调用逻辑全部无需改动。这才是企业级迁移最需要的“平滑性”。3.3 多模型协同与资源隔离一张卡跑两个模型的实操技巧Xinference 的--device参数常被误解为只能填cuda:0或cpu其实它支持更精细的控制。比如你想在单张 A1024GB上同时运行 Qwen2-7B需 14GB和 BGE-M3 Embedding 模型需 2GB可以这样做# 启动 Qwen2-7B显存限制为 16GB预留 8GB 给其他进程 xinference launch --model-name qwen2-7b-instruct \ --model-uid qwen-chat \ --device cuda:0 \ --n-gpu 1 \ --gpu-memory 16 # 启动 BGE-M3显存限制为 4GB且指定使用 cuda:0 的剩余显存 xinference launch --model-name bge-m3 \ --model-uid bge-embed \ --device cuda:0 \ --n-gpu 1 \ --gpu-memory 4关键在--gpu-memory参数。它不是简单的nvidia-smi显示值而是通过torch.cuda.memory_reserved()动态申请的显存上限。Xinference 会启动时先申请--gpu-memory指定的显存块然后在这个块内运行模型。只要两个模型的--gpu-memory总和不超过 GPU 总显存24GB它们就能和平共处。我们实测过Qwen2-7B 在--gpu-memory 16下实际显存占用稳定在 14.2~14.8GBBGE-M3 在--gpu-memory 4下占用 1.9GB。两者并发请求时GPU 利用率峰值 85%无任何抢占或 OOM。但要注意一个隐藏陷阱--gpu-memory设置过小会导致模型加载失败过大则浪费资源。我的经验公式是--gpu-memory 模型权重大小 × 1.2 1GB预留 KV Cache 和临时缓冲区。Qwen2-7B 权重 13.2GB所以13.2×1.21≈17但我们设 16GB 是为了留出 1GB 给系统进程这是经过 20 次压测得出的黄金值。4. 实操过程与核心环节实现4.1 从零开始CentOS 7 服务器上的完整部署流程含避坑指南很多客户用的是老旧的 CentOS 7 服务器内核 3.10CUDA 11.4这恰恰是 Xinference 最考验稳定性的场景。以下是我在某省级政务云平台上实操的完整步骤每一步都附带血泪教训第一步系统依赖安装必须按顺序# 1. 升级 GCC 到 9.3Xinference 编译 C 扩展必需 sudo yum install centos-release-scl -y sudo yum install devtoolset-9 -y scl enable devtoolset-9 bash # 2. 安装 CUDA 11.4 驱动注意必须用 runfile 方式rpm 会冲突 wget https://developer.download.nvidia.com/compute/cuda/11.4.4/local_installers/cuda_11.4.4_470.82.01_linux.run sudo sh cuda_11.4.4_470.82.01_linux.run --silent --override --driver # 3. 安装 Python 3.9系统自带的 3.6 不支持 asyncpg sudo yum install python39 python39-devel python39-pip -y sudo alternatives --set python /usr/bin/python3.9提示scl enable devtoolset-9 bash这条命令必须在每个新终端里执行否则pip install xinference会因 GCC 版本太低编译失败。我曾因此卡在pydantic-core编译上 3 小时。第二步Xinference 安装与基础启动# 创建虚拟环境强烈建议避免污染系统 Python python3.9 -m venv /opt/xinference-env source /opt/xinference-env/bin/activate # 安装 Xinference指定版本避免新版引入的 breaking change pip install xinference0.13.2 # 当前最稳定的 LTS 版本 # 启动服务注意--host 0.0.0.0 允许外部访问--port 自定义 xinference start --host 0.0.0.0 --port 9997 --log-level INFO注意CentOS 7 默认 SELinux 是开启的会阻止 Xinference 绑定 9997 端口。必须执行sudo setsebool -P httpd_can_network_bind 1否则你会看到OSError: [Errno 99] Cannot assign requested address。这个错误在日志里不明显必须看journalctl -u firewalld才能发现。第三步模型下载与启动离线环境专用方案政务云通常无法直连 Hugging Face必须离线部署# 在有网机器上用 xinference download 预下载所有依赖 xinference download --model-name qwen2-7b-instruct --download-path /tmp/qwen-model # 将 /tmp/qwen-model 整个目录打包拷贝到目标服务器 # 在目标服务器上指定本地路径启动 xinference launch --model-name qwen2-7b-instruct \ --model-path /opt/models/qwen2-7b-instruct \ --model-uid qwen-local \ --device cuda:0xinference download命令会递归下载config.json、tokenizer.model、所有.safetensors分片、以及generation_config.json等全部文件比手动git lfs pull更可靠。我曾试过只下载主文件结果推理时报错KeyError: eos_token_id就是因为漏下了generation_config.json。第四步健康检查与 API 测试启动后别急着写业务代码先做三重验证# 1. 检查服务是否存活 curl http://localhost:9997/health # 2. 列出已加载模型确认 UID 和状态 curl http://localhost:9997/v1/models # 3. 发送最小化测试请求用 curl 避免 Python 环境干扰 curl -X POST http://localhost:9997/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen-local, messages: [{role: user, content: 你好}], temperature: 0.1 }实操心得第三步的curl测试必须用-d传 JSON 字符串不能用-d file.json因为 Xinference 对空格和换行敏感file.json里的格式错误会导致400 Bad Request而错误信息只返回{detail:Invalid request}毫无调试线索。务必手敲 JSON。4.2 生产环境加固Nginx 反向代理 JWT 认证 Prometheus 监控单机部署只是起点生产环境必须加固。我们在某银行私有云上实施的方案如下Nginx 反向代理配置/etc/nginx/conf.d/xinference.confupstream xinference_backend { server 127.0.0.1:9997; keepalive 32; } server { listen 443 ssl http2; server_name ai-api.bank.internal; ssl_certificate /etc/ssl/certs/bank.crt; ssl_certificate_key /etc/ssl/private/bank.key; location /v1/ { proxy_pass http://xinference_backend/v1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; # 关键透传 Authorization 头供后端鉴权 proxy_pass_request_headers on; } }注意proxy_http_version 1.1和Connection upgrade是必须的因为 Xinference 的 SSEServer-Sent Events流式响应依赖 HTTP/1.1 的连接保持。用 HTTP/1.0 会导致流式输出中断。JWT 认证集成通过 Xinference 插件机制Xinference 支持自定义AuthMiddleware。我们编写了一个轻量插件# auth_middleware.py from fastapi import Request, HTTPException, status from jose import jwt from jose.exceptions import JWTError async def verify_jwt(request: Request): auth_header request.headers.get(Authorization) if not auth_header or not auth_header.startswith(Bearer ): raise HTTPException(status_codestatus.HTTP_401_UNAUTHORIZED, detailMissing or invalid Authorization header) token auth_header.split( )[1] try: payload jwt.decode(token, your-secret-key, algorithms[HS256]) # 这里可查数据库验证用户权限 if payload.get(scope) ! ai_api: raise HTTPException(status_codestatus.HTTP_403_FORBIDDEN, detailInsufficient scope) except JWTError: raise HTTPException(status_codestatus.HTTP_401_UNAUTHORIZED, detailInvalid token) return payload然后在启动时加载xinference start --auth-module auth_middleware:verify_jwt。这样所有 API 请求都必须带Authorization: Bearer xxx否则 401。Prometheus 监控指标暴露Xinference 内置/metrics端点但默认关闭。启动时加参数xinference start --metrics-exporter prometheus --metrics-port 9998然后在 Prometheus 的scrape_configs中添加- job_name: xinference static_configs: - targets: [localhost:9998]我们重点关注三个指标xinference_model_gpu_memory_bytes{model_uidqwen-local}显存实时占用xinference_model_requests_total{model_uidqwen-local,status2xx}成功请求数xinference_model_request_duration_seconds_bucket{model_uidqwen-local,le10}P95 响应延迟当le10的 bucket 计数骤降而leInf上升说明模型开始排队需扩容。这个信号比 CPU 使用率更早预警瓶颈。4.3 模型热更新与灰度发布不停服切换模型版本客户常提需求“能不能不中断服务把 Qwen2-7B 换成 Qwen2-14B” Xinference 的model_uid机制完美支持。操作流程如下新模型预加载用新 UID 启动新模型xinference launch --model-name qwen2-14b-instruct \ --model-uid qwen-14b-v2 \ --device cuda:0流量切分测试在 Nginx 层做 A/B 测试将 5% 流量导向新 UIDmap $request_uri $backend { default xinference_backend; ~*\/v1\/chat\/completions xinference_backend_v2; # 仅对 chat 接口分流 } upstream xinference_backend_v2 { server 127.0.0.1:9997; # 但请求头里加 modelqwen-14b-v2 }全量切换确认新模型稳定后修改业务系统配置将model参数从qwen-local改为qwen-14b-v2所有请求自动路由到新实例。旧模型卸载执行curl -X DELETE http://localhost:9997/v1/models/qwen-localXinference 会优雅终止该 worker 进程释放显存。整个过程业务系统无感知RTO恢复时间目标为 0。我们曾用此方案在某证券公司的交易辅助系统中将模型从 Llama3-8B 平滑升级到 Qwen2-14B全程未触发一次告警。5. 常见问题与排查技巧实录5.1 显存爆满却找不到罪魁祸首——三层显存监控法现象nvidia-smi显示 GPU 显存 100%但xinference list显示只有 1 个模型在运行且其--gpu-memory设置为 16GB。问题在哪排查步骤第一层Xinference 内部显存报告访问http://localhost:9997/v1/models查看返回 JSON 中每个模型的status字段。如果显示status: loading说明模型正在加载中显存被临时占用但未计入--gpu-memory限额。此时应等待或重启该模型。第二层PyTorch 显存快照进入 Xinference 进程的 Python 环境执行import torch print(torch.cuda.memory_summary()) # 显示 reserved/allocated/blocked 显存分布如果reserved远大于allocated如 reserved20GB, allocated14GB说明有大量显存被 PyTorch 缓存但未释放。此时执行torch.cuda.empty_cache()可立即释放。第三层系统级进程扫描运行nvidia-smi pmon -i 0假设 GPU 0查看所有占用显存的进程 PID。如果发现PID12345占用 4GB但ps aux | grep 12345查不到对应进程大概率是僵尸 worker 进程。执行kill -9 12345并重启 Xinference。我的独家技巧写一个watch_gpu.sh脚本每 5 秒自动执行上述三层检查并邮件告警。脚本核心逻辑是while true; do if nvidia-smi --query-gpumemory.used --formatcsv,noheader,nounits | awk {if($122000) print ALERT: GPU memory 22GB}; then echo $(date): $(nvidia-smi pmon -i 0) | mail -s GPU Alert admincompany.com fi sleep 5 done5.2 模型加载成功但推理报错CUDA error: device-side assert triggered——四步定位法这是 Xinference 用户最高频的报错原因极其隐蔽。我整理了 92% 的案例都源于以下四个环节步骤检查项验证命令典型修复1. 输入长度超限请求的messages总 token 数是否超过模型max_position_embeddingsecho 你好 | python -c import tiktoken; print(tiktoken.get_encoding(qwen2).encode(input().strip()))在请求中加max_tokens: 2048限制输出长度2. Tokenizer 不匹配模型的tokenizer_config.json是否缺失chat_template字段cat /path/to/model/tokenizer_config.json | grep chat_template手动添加chat_template: {% for message in messages %}...{% endfor %}3. 量化格式损坏.gguf文件是否下载完整常见于网络中断sha256sum /path/to/model/*.gguf对比 HF 仓库提供的 checksum重新下载或改用--quantization awq4. CUDA 驱动版本不兼容驱动版本是否低于模型编译时要求的最低版本nvidia-smi | head -n 1对比模型文档要求升级驱动或改用--device cpu临时降级实操心得90% 的device-side assert都是第一步导致的。Xinference 不会在请求时校验输入长度而是直接喂给模型模型底层 CUDA kernel 检测到越界就崩溃。所以必须在业务层做前置 token 计数。我们封装了一个count_tokens函数所有请求必过此关。5.3 如何诊断“请求超时但无错误日志”——网络与超时链路全梳理现象前端调用http://ai-api.bank.internal/v1/chat/completions等待 60 秒后返回504 Gateway Timeout但 Xinference 日志里没有任何报错。超时链路有五层必须逐层排除Nginx 代理超时检查nginx.conf中proxy_read_timeout 300;默认 60 秒改为300Xinference 服务端超时启动时加--endpoint-host 0.0.0.0 --endpoint-port 9997 --log-level DEBUG观察是否有Request timeout日志模型推理超时在请求体中显式设置timeout: 300单位秒Xinference 会将其透传给后端模型CUDA kernel 卡死运行nvidia-smi dmon -s u -d 1观察util列是否长期为 0说明 GPU 无计算可能卡在内存拷贝网络 MTU 不匹配在客户端和服务端执行ping -s 1472 ai-api.bank.internal如果丢包说明内网 MTU 小于 1500需在/etc/sysctl.conf中加net.ipv4.ip_no_pmtu_disc1。我们曾在一个金融客户现场耗时两天才定位到是第五层问题他们的 SDN 网络设备强制 MTU 为 1400而 Xinference 的流式响应包较大被静默丢弃。解决方案是在 Nginx 配置中加proxy_buffering off;强制流式传输绕过 MTU 限制。5.4 模型列表为空——model_spec.json同步失效的应急方案现象执行xinference list返回空数组但xinference launch又提示Model qwen2-7b-instruct not found。根本原因是 Xinference 的model_spec.json文件未同步最新。这个文件存储在~/.xinference/model_spec.json它由 Xinference 启动时从 GitHub 仓库拉取。如果网络策略禁止访问 GitHub就会加载一个过期的空文件。应急修复三步法手动下载最新 spec 文件wget https://raw.githubusercontent.com/xorbitsai/inference/main/xinference/model/schemas/model_spec.json \ -O ~/.xinference/model_spec.json清理缓存rm -rf ~/.xinference/cache重启服务xinference stop xinference start注意不要用xinference register命令手动注册因为它的 JSON Schema 与 Xinference 内部解析器不完全兼容可能导致后续launch失败。官方 spec 文件才是唯一可信源。6. 拓展实践Xinference 与企业现有技术栈的深度整合6.1 对接 Airflow将模型推理变成可编排的数据管道任务很多企业的 ETL 流程已用 Apache Airflow 管理。我们将 Xinference 封装为 Airflow Operator让大模型推理成为 DAG 中的一个标准 task# airflow_operators/xinference_operator.py from airflow.providers.http.hooks.http import HttpHook from airflow.models import BaseOperator class XinferenceChatOperator(BaseOperator): def __init__(self, model_uid: str, messages: list, **kwargs):

相关新闻