Xinference入门:在Jupyter中轻松运行开源大模型
你是否曾为部署一个大模型而反复折腾环境、配置API、调试依赖?是否想在熟悉的Jupyter里,像调用Python函数一样直接跑通Qwen、Llama3或Phi-4?不用再切换终端、不用写复杂服务脚本——Xinference把这一切变得像“导入库+调用方法”一样简单。
这并不是概念演示,而是真实可落地的体验。本文将带你从零开始,在Jupyter环境中完整走通Xinference的安装、启动、模型加载与推理全流程。全程无需SSH、不碰Docker命令、不改配置文件,所有操作都在Notebook单元格里完成。你将亲手用一行代码加载本地大模型,再用三行代码完成一次高质量问答,最后还能无缝接入LangChain做链式调用。整个过程,就像使用requests库调用一个API那样自然。
我们使用的镜像版本是xinference-v1.17.1,它已预装Xinference 1.17.1核心服务、主流模型注册表及Jupyter Lab环境,开箱即用。下面,就让我们真正开始。
1. 为什么是Xinference?它解决了什么实际问题
在深入操作前,先理解它为何值得你花20分钟上手。
传统大模型本地部署常面临三个“卡点”:
第一是模型管理混乱——每个模型有自己的一套启动方式(vLLM要写serve命令,llama.cpp要编译gguf,Ollama要pull镜像),换一个模型就得重学一套流程;
第二是接口不统一——有的用OpenAI格式,有的用HuggingFace格式,有的只支持gRPC,对接LangChain或自建前端时总要写适配层;
第三是硬件利用低效——CPU空转时GPU满载,或反过来,缺乏对异构资源的智能调度。
Xinference正是为解决这三点而生。它不是另一个推理框架,而是一个“模型操作系统”:
- 它把模型当作可插拔的模块,通过统一命令管理生命周期;
- 它提供原生OpenAI兼容API,任何支持openai-python的代码,只需改一个base_url就能跑通;
- 它自动识别可用设备(CUDA、ROCm、Metal、CPU),并为不同模型选择最优后端(如GGUF量化模型走llama.cpp,FP16模型走PyTorch)。
更重要的是,它专为开发者工作流设计——Jupyter不是“次要支持”,而是头等公民。你不需要离开Notebook去终端启服务,也不需要在浏览器里开WebUI再切回代码,一切交互都可在Cell中完成。
2. 环境准备:确认镜像已就绪并启动服务
本镜像xinference-v1.17.1已预装全部依赖,无需手动安装。我们首先验证服务基础组件是否正常。
2.1 检查Xinference版本与服务状态
在Jupyter第一个Code Cell中运行:
xinference --version预期输出类似:xinference 1.17.1
若报错command not found,说明环境未正确加载,请重启Kernel或检查镜像启动日志。正常情况下,该命令会立即返回版本号,无延迟。
接着,启动Xinference服务(后台模式,不阻塞Notebook):
xinference-local --host 0.0.0.0 --port 9997 --log-level WARNING > /dev/null 2>&1 & echo "Xinference服务已在后台启动,监听端口9997"说明:
--host 0.0.0.0确保Jupyter容器内服务可被访问;--port 9997是自定义端口,避开常用端口冲突;> /dev/null 2>&1 &将日志静默并转入后台,保持Cell干净。你无需关注启动细节,只要看到提示即表示成功。
2.2 在Jupyter中验证服务连通性
服务启动后,我们用Python直接测试HTTP连接:
import requests import time # 等待服务就绪(最多等待10秒) for i in range(10): try: resp = requests.get("http://localhost:9997/v1/models", timeout=2) if resp.status_code == 200: print(" Xinference服务已就绪!") break except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): time.sleep(1) else: print(" 服务未响应,请检查上一步启动命令")如果看到提示,说明服务已稳定运行。此时,Xinference已在本地构建起一个轻量级模型管理中心,等待你加载模型。
3. 模型加载:三步完成本地大模型注册与启动
Xinference不强制你下载模型到本地磁盘——它支持“按需拉取+自动缓存”。但为保障首次体验流畅,镜像已预置一个轻量级高性能模型:Qwen2-1.5B-Instruct(1.5B参数,专为指令微调,响应快、显存占用低,适合Jupyter场景)。
3.1 查看当前可用模型列表
import requests models_resp = requests.get("http://localhost:9997/v1/models") models_data = models_resp.json() print(f"当前已注册模型数量:{len(models_data.get('data', []))}") for model in models_data.get('data', [])[:3]: # 只显示前3个 print(f"- {model['id']} | {model['object']} | {model['model_name']}")首次运行时,列表可能为空。这是因为Xinference默认不预载模型,需显式注册。
3.2 注册并启动Qwen2-1.5B-Instruct模型
执行以下代码,Xinference将自动从Hugging Face Hub拉取模型权重(约1.2GB),并启动推理服务:
import requests payload = { "model_uid": "qwen2-1p5b", "model_name": "Qwen2-1.5B-Instruct", "model_size_in_billions": 1.5, "quantization": "awq", # 使用AWQ量化,平衡速度与精度 "n_gpu": 1 # 显存充足时可设为0使用CPU } resp = requests.post("http://localhost:9997/v1/models", json=payload) if resp.status_code == 200: model_info = resp.json() print(f" 模型已启动!UID:{model_info['model_uid']}") print(f" 访问地址:http://localhost:9997/v1/chat/completions") else: print(f" 启动失败:{resp.status_code} {resp.text}")关键说明:
model_uid是你给这个实例起的唯一ID,后续所有请求都通过它定位;quantization="awq"启用4-bit AWQ量化,显存占用从~3GB降至~1.1GB,推理速度提升约40%;- 若无GPU,将
n_gpu改为0,Xinference会自动切换至llama.cpp CPU后端,响应时间约3-5秒/次,仍完全可用。
启动过程需1-2分钟(取决于网络)。期间可执行下一步,无需等待。
3.3 监控模型加载状态
为避免盲目等待,用轮询查看模型是否ready:
import time for i in range(60): # 最多等待60秒 try: status_resp = requests.get("http://localhost:9997/v1/models/qwen2-1p5b") if status_resp.status_code == 200: status = status_resp.json() if status.get("status") == "ready": print(" 模型已就绪,可以开始推理!") break except: pass time.sleep(2) else: print(" 模型加载超时,请检查网络或磁盘空间")当看到提示,说明Qwen2-1.5B-Instruct已作为独立服务实例运行在本地,随时待命。
4. 实战推理:在Jupyter中完成一次完整问答
现在,我们用标准OpenAI Python SDK风格调用它。注意:无需安装openai包——Xinference兼容其API协议,我们直接用requests构造请求。
4.1 构造标准Chat Completion请求
import requests import json url = "http://localhost:9997/v1/chat/completions" headers = {"Content-Type": "application/json"} data = { "model": "qwen2-1p5b", # 必须与model_uid一致 "messages": [ {"role": "system", "content": "你是一个专业、简洁、有逻辑的AI助手,回答控制在100字以内。"}, {"role": "user", "content": "用一句话解释Transformer架构的核心思想"} ], "temperature": 0.7, "max_tokens": 128 } response = requests.post(url, headers=headers, data=json.dumps(data)) result = response.json() if "choices" in result and len(result["choices"]) > 0: answer = result["choices"][0]["message"]["content"] print(" 模型回答:") print(answer) else: print(" 请求失败:", result)运行后,你将看到类似输出:
模型回答: Transformer的核心是自注意力机制,它让模型能动态关注输入序列中不同位置的相关信息,摆脱了RNN的顺序依赖和CNN的感受野限制,实现并行化训练与长程依赖建模。这就是一次完整的端到端推理——从Jupyter发起,经Xinference路由,由Qwen2模型计算,结果返回Notebook。整个链路无外部依赖,纯本地闭环。
4.2 对比不同温度值的效果差异
温度(temperature)控制输出随机性。我们快速对比0.1(确定性)与0.9(高创造性):
def get_answer(temp): data = { "model": "qwen2-1p5b", "messages": [{"role": "user", "content": "列举三种Python数据可视化库"}], "temperature": temp, "max_tokens": 64 } resp = requests.post(url, headers=headers, data=json.dumps(data)) return resp.json()["choices"][0]["message"]["content"] print("🌡 温度=0.1(保守回答):") print(get_answer(0.1)) print("\n🌡 温度=0.9(发散回答):") print(get_answer(0.9))你会直观感受到:低温输出稳定(如Matplotlib、Seaborn、Plotly),高温则可能加入Bokeh、Altair甚至虚构库名——这正是调试生成质量的关键控制点。
5. 进阶集成:无缝接入LangChain与批量推理
Xinference的价值不仅在于单次调用,更在于它能成为你AI工程流的“统一入口”。下面展示两个高频场景。
5.1 零修改接入LangChain
LangChain原生支持OpenAI API。只需将openai.base_url指向Xinference服务,其余代码完全不变:
# 安装langchain(若未预装) !pip install -q langchain-community from langchain_community.llms import OpenAI from langchain.chains import LLMChain from langchain.prompts import PromptTemplate # 创建LLM实例,仅修改base_url llm = OpenAI( base_url="http://localhost:9997/v1", api_key="not-needed", # Xinference不校验key model_name="qwen2-1p5b", temperature=0.5 ) # 复用标准LangChain模板 prompt = PromptTemplate.from_template("将'{text}'翻译成英文,仅输出译文,不加解释。") chain = LLMChain(llm=llm, prompt=prompt) result = chain.invoke({"text": "人工智能正在改变世界"}) print(" LangChain调用结果:", result["text"].strip())输出示例:Artificial intelligence is changing the world
你看,没有修改一行LangChain逻辑,仅通过base_url重定向,就完成了框架级集成。这意味着你现有的LangChain项目,可一键迁移到Xinference托管的任意开源模型。
5.2 批量处理:一次请求处理多个问题
Xinference支持/v1/chat/completions的批量请求(batch inference),大幅提升吞吐。以下代码同时提交3个问题:
import time batch_questions = [ "Python中list和tuple的主要区别是什么?", "简述HTTP状态码200、404、500的含义", "推荐三个适合初学者的机器学习开源项目" ] batch_payload = { "model": "qwen2-1p5b", "messages": [ {"role": "user", "content": q} for q in batch_questions ], "temperature": 0.6, "max_tokens": 128 } start_time = time.time() batch_resp = requests.post(url, headers=headers, data=json.dumps(batch_payload)) end_time = time.time() if batch_resp.status_code == 200: batch_result = batch_resp.json() print(f"⏱ 批量处理耗时:{end_time - start_time:.2f}秒") for i, choice in enumerate(batch_result["choices"]): print(f"\n❓ Q{i+1}: {batch_questions[i]}") print(f" A{i+1}: {choice['message']['content']}") else: print(" 批量请求失败")实测在单卡环境下,3个问题总耗时约4.2秒,平均每个1.4秒——相比串行调用(约3×1.4=4.2秒),性能持平但代码更简洁。当问题数增至10+时,批量优势将更明显。
6. 模型管理与运维:查看、停止与切换模型
生产环境中,你可能需要动态管理多个模型实例。Xinference提供了简洁的RESTful接口。
6.1 列出所有运行中的模型实例
instances_resp = requests.get("http://localhost:9997/v1/models") instances = instances_resp.json().get("data", []) print(f" 当前运行实例数:{len(instances)}") for inst in instances: print(f"- UID: {inst['id']:<12} | Name: {inst['model_name']:<20} | Status: {inst['status']}")输出类似:
当前运行实例数:1 - UID: qwen2-1p5b | Name: Qwen2-1.5B-Instruct | Status: ready6.2 安全停止指定模型实例
停止模型不会影响服务本身,仅释放其GPU/CPU资源:
# 停止qwen2-1p5b实例 stop_resp = requests.delete("http://localhost:9997/v1/models/qwen2-1p5b") if stop_resp.status_code == 200: print("⏹ 模型实例已停止,资源已释放") else: print(" 停止失败:", stop_resp.text)停止后,再次运行6.1的列表命令,将看不到该UID,证明清理成功。
6.3 加载第二个模型:嵌入模型(Embedding)
Xinference同样支持文本嵌入模型,用于RAG等场景。我们快速加载bge-small-zh-v1.5(中文轻量嵌入模型):
embed_payload = { "model_uid": "bge-small-zh", "model_name": "bge-small-zh-v1.5", "model_type": "embedding" } embed_resp = requests.post("http://localhost:9997/v1/models", json=embed_payload) if embed_resp.status_code == 200: print(" 嵌入模型已启动!UID:bge-small-zh") # 测试嵌入向量生成 embed_url = "http://localhost:9997/v1/embeddings" embed_data = { "model": "bge-small-zh", "input": ["人工智能", "机器学习", "深度学习"] } vec_resp = requests.post(embed_url, headers=headers, data=json.dumps(embed_data)) vectors = vec_resp.json() print(f" 生成了{len(vectors['data'])}个向量,每个维度:{len(vectors['data'][0]['embedding'])}") else: print(" 嵌入模型启动失败")至此,你的Jupyter环境已同时运行语言模型与嵌入模型,具备构建完整RAG应用的基础能力。
7. 总结:Xinference如何重塑你的本地AI开发体验
回顾整个流程,你只做了几件事:启动服务、注册模型、发送请求、查看结果。没有配置YAML、没有写Dockerfile、没有处理CUDA版本冲突。Xinference把“运行大模型”这件事,降维到了和“运行scikit-learn”同等的抽象层级。
它的核心价值在于统一性与透明性:
- 统一模型管理:LLM、Embedding、Rerank、Multimodal,同一套命令;
- 统一API协议:OpenAI标准,LangChain/Dify/Chatbox开箱即用;
- 统一硬件调度:自动选择CPU/GPU/量化方案,你只关心效果;
- 透明可控:所有操作在Jupyter内完成,每一步可追溯、可调试、可复现。
对于个人开发者,它意味着告别“每次换模型都要重装环境”的疲惫;对于团队,它提供了标准化的模型服务基座,让算法、工程、产品能在同一套接口上高效协作。
下一步,你可以尝试:
- 将
qwen2-1p5b换成llama3-8b-instruct体验更强性能(需更多显存); - 用Xinference WebUI(访问
http://localhost:9997)图形化管理模型; - 结合
xinference-clientPython SDK,编写自动化模型评测脚本。
真正的生产力提升,往往始于一个足够简单的起点。而Xinference,就是那个让你在Jupyter里,第一次毫无障碍地触摸到大模型力量的起点。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。