Phi-3-mini-4k-instruct部署教程:Ollama + Kubernetes Helm Chart实现集群化部署

想快速体验一个轻量级但能力不俗的开源大模型吗?今天我们来聊聊如何用最“云原生”的方式,把微软的Phi-3-mini-4k-instruct模型部署起来。如果你对直接使用Web界面不感兴趣,而是希望把它变成一个可以弹性伸缩、高可用的服务,那么这篇教程就是为你准备的。

我们将使用Ollama作为模型的运行时,再通过Kubernetes Helm Chart把它打包成一套标准的云服务。这样一来,你就能在几分钟内,从零开始搭建一个属于你自己的私有化文本生成服务集群。

1. 为什么选择这个组合?

在开始动手之前,我们先简单了解一下这套方案的核心组件,以及它们能带来什么好处。

1.1 Phi-3-mini-4k-instruct:小而精悍的模型

Phi-3-mini-4k-instruct是微软Phi-3系列中的“小个子”,只有38亿参数。别看它体积小,它在多项基准测试中的表现,足以媲美一些参数大它好几倍的模型。

它的特点非常鲜明:

  • 轻量高效:38亿参数,对硬件要求友好,在消费级显卡甚至部分CPU上都能流畅运行。
  • 指令跟随能力强:专门针对“指令-回答”模式进行了优化训练,你问什么,它就能很好地回答什么,对话体验很自然。
  • 上下文长度4K:可以处理大约3000个汉字左右的上下文,对于大多数日常问答、文案生成、代码辅助等场景完全够用。
  • 开源免费:完全开放,可以自由部署、研究和商用。

简单来说,它是一个在“效果”和“资源消耗”之间取得了很好平衡的模型,非常适合作为入门实践或者对成本敏感的生产场景。

1.2 Ollama:大模型的一键运行器

Ollama的出现,极大简化了在本地运行大模型的过程。你可以把它理解成一个专门为运行大模型优化的“容器”或“运行时环境”。

它的优点在于:

  • 开箱即用:一条命令就能下载并启动模型,无需复杂的Python环境配置或依赖冲突解决。
  • 统一的API:无论底层是什么模型,都通过相同的RESTful API(默认端口11434)进行交互,降低了集成复杂度。
  • 资源管理:可以方便地查看模型运行状态、占用资源,并进行基础的管理。

1.3 Kubernetes + Helm:云原生部署的标准答案

如果只是单机运行,Ollama本身已经足够简单。但当我们谈论“服务化”、“集群化”、“高可用”时,Kubernetes (K8s) 是不二之选。

  • Kubernetes:负责容器化应用的编排、调度、扩缩容和自愈。它能确保你的Phi-3服务在某个节点故障时自动迁移,在流量激增时自动增加实例。
  • Helm:是K8s的“包管理器”。我们把Ollama和Phi-3模型的部署配置(比如需要多少CPU/内存、如何暴露服务、如何挂载存储等)打包成一个Helm Chart。你只需要修改几个参数,就能一键将整个服务部署到K8s集群中,无需手动编写一堆复杂的YAML文件。

这个组合的最终目标:将一个开源大模型,通过标准化的工具,变成一项稳定、可扩展的云服务。

2. 部署准备:环境与工具

在运行Helm命令之前,我们需要确保基础环境已经就绪。以下是整个部署的架构示意图和准备工作。

[ 你的电脑 ] --(helm install)--> [ Kubernetes集群 ]
                                          |
                                          |-- (Pod) [ Ollama + Phi-3模型 ] 
                                          |-- (Service) 负载均衡访问入口
                                          |-- (Ingress) 对外提供HTTP服务(可选)

2.1 前提条件

请确保你拥有以下环境或权限:

  1. 一个可用的Kubernetes集群:可以是云服务商提供的(如阿里云ACK、腾讯云TKE、AWS EKS),也可以是本地搭建的(如minikube, k3s, kind)。你需要拥有在该集群上部署应用的权限(kubectl 能够正常工作)。
  2. 已安装并配置Helm:Helm的版本建议在v3.8以上。你可以通过 helm version 命令检查。
  3. 集群资源:建议为每个Phi-3-mini实例分配至少2核CPU和4GB内存。模型本身约占用2.4GB磁盘空间。
  4. 网络访问:部署Pod的节点需要能够访问互联网(如Docker Hub或GitHub)以下载Ollama镜像和Phi-3模型文件。

2.2 获取部署文件

我们将使用一个预先编写好的Helm Chart来部署。你可以从相关的代码仓库获取。

# 克隆包含Helm Chart的仓库(这里是一个示例路径,请替换为实际地址)
git clone https://github.com/your-org/ollama-phi3-helm-chart.git
cd ollama-phi3-helm-chart

这个Chart目录结构通常如下:

ollama-phi3-helm-chart/
├── Chart.yaml          # Chart的元数据信息
├── values.yaml         # 默认的配置参数(我们将主要修改这个文件)
├── templates/          # Kubernetes资源模板文件
│   ├── deployment.yaml # 定义Ollama的Deployment
│   ├── service.yaml    # 定义对外的Service
│   └── ...
└── ...

3. 核心部署步骤详解

一切准备就绪,现在开始最关键的一步:定制化配置并安装。

3.1 配置Helm Values

我们不需要直接修改模板,而是通过覆盖 values.yaml 文件中的参数来定制部署。创建一个用于覆盖的配置文件,例如 my-phi3-values.yaml

# my-phi3-values.yaml
# 1. 镜像与模型配置
ollama:
  image:
    repository: ollama/ollama # Ollama官方镜像
    tag: latest               # 建议指定一个稳定版本,如0.1.29
  model: phi3:mini           # 指定要拉取和运行的模型,Ollama会自动下载
  # 环境变量,例如可以设置代理(如果需要)
  env:
    - name: OLLAMA_HOST
      value: "0.0.0.0"       # 监听所有网络接口

# 2. 资源请求与限制(根据你的集群实际情况调整)
resources:
  requests:
    memory: "4Gi"
    cpu: "2"
  limits:
    memory: "8Gi"
    cpu: "4"

# 3. 服务暴露配置
service:
  type: ClusterIP           # 默认类型,仅在集群内访问
  port: 11434              # Ollama默认API端口
  # 如果你需要从集群外部访问,可以改为NodePort或结合Ingress
  # type: NodePort
  # nodePort: 31134        # 手动指定NodePort端口(范围30000-32767)

# 4. 持久化存储(强烈建议配置,否则模型文件在Pod重启后会丢失)
persistence:
  enabled: true
  storageClass: "standard" # 指定你的K8s集群中的StorageClass名称
  accessMode: ReadWriteOnce
  size: 10Gi               # 存储空间大小,模型本身约2.4G,预留一些空间
  mountPath: /root/.ollama # Ollama默认的模型存储路径

# 5. 副本数(实现高可用和负载均衡)
replicaCount: 1            # 初始可以从1个副本开始,后续可以水平扩展

关键配置解读

  • ollama.model:这是核心配置,告诉Ollama在启动时自动拉取并加载哪个模型。phi3:mini 是Ollama社区认可的模型标签。
  • persistence:务必启用。这会将模型数据保存在持久化卷(PV)中,即使Pod被重新调度,模型也无需重新下载。
  • replicaCount:设置为2或以上,Kubernetes会为你创建多个相同的Pod,并通过Service实现负载均衡,提升服务的可用性和吞吐量。

3.2 执行Helm安装命令

使用 helm install 命令,将我们的应用部署到Kubernetes集群。[RELEASE_NAME] 是你为这次部署起的名字,比如 phi3-mini

# 语法:helm install [RELEASE_NAME] [CHART_PATH] -f [VALUES_FILE] -n [NAMESPACE]
helm install phi3-mini . -f my-phi3-values.yaml -n ai-models --create-namespace

命令参数说明

  • phi3-mini:这次部署在Helm中的发布名称。
  • .:表示使用当前目录下的Chart。
  • -f my-phi3-values.yaml:使用我们自定义的配置文件覆盖默认值。
  • -n ai-models:指定部署到名为 ai-models 的命名空间中。--create-namespace 会在命名空间不存在时自动创建它。

执行后,你会看到类似下面的输出,提示部署成功,并给出一些后续操作提示。

NAME: phi3-mini
LAST DEPLOYED: Fri Nov  1 10:00:00 2024
NAMESPACE: ai-models
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=phi3-mini -n ai-models -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:11434 to access the Ollama API"
  kubectl port-forward $POD_NAME 11434:11434 -n ai-models

3.3 验证部署状态

部署命令执行很快,但Pod启动并拉取模型需要一些时间。我们可以通过以下命令观察进度。

# 查看指定命名空间下的所有资源
kubectl get all -n ai-models

# 重点关注Pod的状态,直到状态变为“Running”
kubectl get pods -n ai-models -w

# 查看Pod的详细日志,特别是模型拉取和加载的进度
kubectl logs -f deployment/phi3-mini -n ai-models

在日志中,你会看到Ollama启动并开始拉取 phi3:mini 模型。拉取完成后,日志会显示模型加载成功的信息。这可能需要几分钟,取决于你的网络速度。

4. 使用与测试你的Phi-3服务

当Pod状态变为 Running 后,你的Phi-3-mini文本生成服务就已经在K8s集群里跑起来了。接下来,我们看看怎么使用它。

4.1 在集群内部进行测试

首先,我们可以在集群内创建一个临时的测试Pod,通过命令行调用服务。

# 启动一个包含curl工具的临时Pod
kubectl run curl-test --image=curlimages/curl -it --rm --restart=Never -n ai-models -- sh

# 进入Pod的shell后,执行以下命令测试Ollama API
# 注意:phi3-mini是Service的名字,ai-models是命名空间
curl http://phi3-mini.ai-models.svc.cluster.local:11434/api/generate -d '{
  "model": "phi3:mini",
  "prompt": "请用一句话介绍你自己。",
  "stream": false
}'

如果一切正常,你将收到一个JSON格式的响应,其中包含模型生成的回答。

4.2 (可选)从集群外部访问

默认的 ClusterIP 服务类型只能在集群内访问。如果你需要从外部(比如你的开发机)调用,有几种方法:

方法一:使用kubectl port-forward(临时,适合调试)

# 将本地的11434端口转发到集群中的Service
kubectl port-forward svc/phi3-mini 11434:11434 -n ai-models

转发后,你就可以在本地浏览器或使用curl访问 http://localhost:11434 了。

方法二:修改Service为NodePort(固定端口) 修改 my-phi3-values.yaml 中的 service.typeNodePort,并可选指定 nodePort,然后使用 helm upgrade 更新部署。之后可以通过任意集群节点IP和指定的NodePort访问。

方法三:通过Ingress暴露(生产环境推荐) 配置Ingress控制器(如Nginx Ingress),并在Chart的 values.yaml 中配置Ingress规则,通过域名和HTTPS访问。这需要更复杂的配置,但是最标准的生产方式。

4.3 编写一个简单的客户端脚本

服务稳定运行后,你可以用任何喜欢的编程语言来调用它。这里是一个Python示例:

# test_phi3_client.py
import requests
import json

# 如果你的服务通过Ingress或NodePort暴露,请替换下面的URL
# 如果是port-forward,地址就是 http://localhost:11434
OLLAMA_API_URL = "http://phi3-mini.ai-models.svc.cluster.local:11434/api/generate"

def ask_phi3(prompt):
    payload = {
        "model": "phi3:mini",
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.7, # 控制创造性,越低越确定,越高越随机
            "num_predict": 128  # 生成的最大token数
        }
    }
    try:
        response = requests.post(OLLAMA_API_URL, json=payload, timeout=60)
        response.raise_for_status()
        result = response.json()
        return result["response"]
    except requests.exceptions.RequestException as e:
        return f"请求出错: {e}"

if __name__ == "__main__":
    question = "解释一下什么是云计算。"
    answer = ask_phi3(question)
    print(f"Q: {question}")
    print(f"A: {answer}")

运行这个脚本,就能看到Phi-3-mini模型生成的回答了。

5. 运维与进阶配置

部署完成只是第一步,要让服务稳定运行,还需要关注以下方面。

5.1 监控与日志

  • 查看日志kubectl logs -f deployment/phi3-mini -n ai-models
  • 资源监控:使用 kubectl top pods -n ai-models 查看Pod的CPU和内存使用情况。对于生产环境,建议集成Prometheus和Grafana。
  • 就绪探针:我们可以在Deployment中配置就绪探针,确保模型完全加载后再接收流量。这需要在Helm Chart模板中增加相关配置。

5.2 扩缩容

当请求量增大时,你可以轻松地水平扩展Pod的数量。

# 将副本数扩展到3个
kubectl scale deployment phi3-mini --replicas=3 -n ai-models

# 或者通过Helm升级values.yaml中的replicaCount并执行
# helm upgrade phi3-mini . -f my-phi3-values.yaml -n ai-models

Kubernetes的Service会自动将请求负载均衡到所有健康的Pod上。

5.3 升级与回滚

  • 升级模型或Ollama版本:修改 my-phi3-values.yaml 中的 ollama.image.tagollama.model(例如换成 phi3:mini-128k),然后执行 helm upgrade ...注意:更换模型可能需要重新下载,请确保持久化存储空间足够。
  • 回滚:如果升级出现问题,可以使用 helm rollback phi3-mini [REVISION_NUMBER] -n ai-models 快速回退到之前的稳定版本。

5.4 模型管理与安全

  • 多模型支持:一个Ollama实例可以加载多个模型。你可以通过API动态加载/卸载模型,但更常见的做法是为不同模型部署独立的Helm Release,实现资源隔离。
  • API安全:目前我们的服务没有设置认证。在生产环境中,你应该通过Ingress配置HTTPS、设置API网关(如Kong, APISIX)来添加认证(API Key, JWT等),或者将服务部署在内部网络,仅允许可信服务访问。

6. 总结

通过这篇教程,我们完成了一件很有成就感的事:将一个开源大模型Phi-3-mini-4k-instruct,从单纯的本地可运行程序,变成了一套部署在Kubernetes集群上的、可扩展、易管理的云服务。

我们来回顾一下关键步骤和优势:

  1. 标准化部署:使用Helm Chart将Ollama和模型配置代码化、版本化,实现一键部署和复制。
  2. 资源与高可用:借助Kubernetes,我们能精确控制服务占用的CPU/内存,并能通过增加副本数轻松应对高并发,某个实例故障时也能自动恢复。
  3. 持久化存储:通过配置持久化卷,模型数据得以保留,避免了每次重启都重新下载的尴尬。
  4. 灵活的访问方式:服务可以在集群内被其他应用直接调用,也可以通过NodePort、Ingress等方式安全地暴露给外部。

这套方案不仅适用于Phi-3-mini,也适用于Ollama支持的任何其他模型(如Llama 3, Mistral, Gemma等)。你只需要修改 values.yaml 中的 model 参数,就能快速切换或部署新的模型服务。

下一步,你可以尝试:

  • 为这个服务添加一个简单的Web UI前端。
  • 配置HPA(Horizontal Pod Autoscaler),让Pod数量能根据CPU使用率自动调整。
  • 将模型服务与你现有的业务应用(如客服系统、内容生成平台)进行集成。

希望这个教程能帮你打开大模型服务化部署的大门。动手试试吧,享受在云端驾驭AI模型的乐趣。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐