基于ACK搭建具备大模型和向量检索功能的知识库应用程序

本文主要介绍如何基于阿里云ACK集成DeepGPU-LLM推理引擎与AnalyticDB PostgreSQL云原生数据仓库,结合LangChain-ChatChat开源框架,可快速搭建检索增强生成(RAG)大模型知识库系统。

背景信息

  • DeepGPU-LLM是阿里云基于GPU云服务器研发的LLM推理引擎,专为大语言模型(LLM)推理任务设计,提供高性能推理服务。更多信息,请参见什么是推理引擎DeepGPU-LLM

  • AnalyticDB PostgreSQL版基于Greenplum开源项目开发,由阿里云深度优化,兼容ANSI SQL 2003PostgreSQL/Oracle生态,支持行/列存储模式。兼具高性能离线数据处理与高并发在线分析查询能力。更多信息,请参见AnalyticDB PostgreSQL版产品概述

  • 开源本地知识库问答项目Langchain-Chatchat相关信息,请参见Langchain-Chatchat

重要
  • 阿里云不对第三方模型的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。

  • 您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

前提条件

创建ACK Pro集群创建ACK Serverless集群,且集群需要满足以下条件。

  • 需要为集群添加GPU节点。GPU机型需要为V100、A10系列,不支持vGPU。为避免显存不足,建议GPU机型的显存≥24 GiB。

  • 需要为集群配置NAT网关,使您的集群节点和应用具有公网访问能力。

费用说明

如果您在使用ACK托管集群ProACK Serverless集群中创建其他阿里云资源(如GPU节点、NAT网关等)时,需按对应产品计费规则付费。详细计费信息,请参见计费说明

步骤一:部署LangChain-Chatchat应用

  1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

  2. 应用市场页面,搜索langchain-chatchat,然后单击该应用。

  3. 在应用详情页面,单击右上角的一键部署,然后在弹出的使用须知对话框中仔细阅读提示内容并单击我已知晓

  4. 基本信息页面,填写目标集群、命名空间和发布名称后,单击下一步

  5. 参数配置页面,将参数配置完成后,单击确定

    以下为参数说明。本文以通义千问模型为示例。

    参数

    说明

    默认值

    llm.model

    llm模型名称。

    qwen-7b-chat-aiacc

    llm.load8bit

    llm模型int8量化。

    true

    llm.modelPVC

    模型存储PVC,挂载到容器内/llm-model目录。

    true

    llm.pod.replicas

    模型推理服务副本数量。

    1

    llm.pod.instanceType

    模型推理服务部署方式,取值:

    • ecs:部署到ECS节点上。

    • eci:部署到ECI上。ACK Serverless集群请取值为eci

    ecs

    chat.pod.replicas

    应用服务副本数量。

    1

    chat.pod.instanceType

    应用部署方式,取值:

    • ecs:部署到ECS节点上。

    • eci:部署到ECI上。ACK Serverless集群请取值为eciACK Serverless集群如何使用GPU实例,请参见指定GPU规格创建Pod

    ecs

    chat.kbPVC

    知识库本地存储PVC,用于保存知识库文件。挂载到容器内/root/Langchain-Chatchat/knowledge_base目录。

    db.dbType

    向量数据库类型,支持faiss、adb。

    faiss

    db.embeddingModel

    embedding模型。

    text2vec-bge-large-chinese

  6. 在目标集群的左侧导航栏,选择工作负载 > 无状态,然后选择langchain-chatchat所部署的命名空间,等待Pod就绪,即容器组数量变为1/1。

    说明

    镜像拉取大约需要10~20分钟。

步骤二:访问服务

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 服务

  3. 服务页面,查看langchain-chatchat部署的服务名称,服务名称格式为chat-{releaseName}

  4. 通过浏览器查看langchain-chatchat应用。

    1. 执行如下命令,将集群中的chat服务映射到本地8501端口。

      # 将chat-chatchat替换为实际service的名称,aigc替换为实际service所在的命名空间。
      kubectl port-forward service/chat-chatchat 8501:8501 -n aigc

      预期输出:

      Forwarding from 127.0.0.1:8501 -> 8501
      Forwarding from [::1]:8501 -> 8501
      Handling connection for 8501
    2. 在浏览器输入http://localhost:8501访问服务。

      预期输出如下所示。

      image.png

常见问题

如何更换模型?

  1. 下载模型。

    若需部署其他开源模型,需从HuggingFace/ModelScope下载模型并存储至OSS/NAS。例如支持替换以下模型列表,具体兼容类型,请参见langchain-chatchat

    模型类型

    模型名称

    容器内模型文件路径

    DeepGPU-LLM转换模型

    qwen-7b-chat-aiacc

    /llm-model/qwen-7b-chat-aiacc

    DeepGPU-LLM转换模型

    qwen-14b-chat-aiacc

    /llm-model/qwen-14b-chat-aiacc

    DeepGPU-LLM转换模型

    chatglm2-6b-aiacc

    /llm-model/chatglm2-6b-aiacc

    DeepGPU-LLM转换模型

    baichuan2-7b-chat-aiacc

    /llm-model/baichuan2-7b-chat-aiacc

    DeepGPU-LLM转换模型

    baichuan2-13b-chat-aiacc

    /llm-model/baichuan2-13b-chat-aiacc

    DeepGPU-LLM转换模型

    llama-2-7b-hf-aiacc

    /llm-model/llama-2-7b-hf-aiacc

    DeepGPU-LLM转换模型

    llama-2-13b-hf-aiacc

    /llm-model/llama-2-13b-hf-aiacc

    开源模型

    qwen-7b-chat

    /llm-model/Qwen-7B-Chat

    开源模型

    qwen-14b-chat

    /llm-model/Qwen-14B-Chat

    开源模型

    chatglm2-6b

    /llm-model/chatglm2-6b

    开源模型

    chatglm2-6b-32k

    /llm-model/chatglm2-6b-32k

    开源模型

    baichuan2-7b-chat

    /llm-model/Baichuan2-7B-Chat

    开源模型

    baichuan2-13b-chat

    /llm-model/Baichuan2-13B-Chat

    开源模型

    llama-2-7b-hf

    /llm-model/Llama-2-7b-hf

    开源模型

    llama-2-13b-hf

    /llm-model/Llama-2-13b-hf

  2. (可选)转换模型。

    本文的Langchain-chatchat项目已安装DeepGPU-LLM转换模型,默认使用DeepGPU-LLM加速后的模型qwen-7b-chat-aiacc

    如需使用DeepGPU-LLM对其他开源LLM模型进行推理优化,您需要先将huggingface格式的开源模型转换为DeepGPU-LLM支持的格式,然后才能使用DeepGPU-LLM进行模型的推理优化服务。

    qwen-7b-chat为例,您可以使用以下命令在容器中进行模型格式转换;也可以在安装推理引擎DeepGPU-LLM后,使用DeepGPU-LLM进行模型格式转换。具体操作,请参见安装并使用DeepGPU-LLM

    # qwen-7b weight convert
    huggingface_qwen_convert \
        -in_file /llm-model/Qwen-7B-Chat \
        -saved_dir /llm-model/qwen-7b-chat-aiacc \
        -infer_gpu_num 1 \
        -weight_data_type fp16 \
        -model_name qwen-7b
  3. 创建静态PVPVC。

    1. OSS为例,模型下载完成后,执行以下命令,创建Secret。

      kubectl create -f oss-secret.yaml

      以下为创建Secretoss-secret.yaml示例文件,需要指定akIdakSecret。

      apiVersion: v1
      kind: Secret
      metadata:
        name: oss-secret
        namespace: default
      stringData:
        akId: <your AccessKeyID>
        akSecret: <your AccessKeySecret>
    2. 执行以下命令,创建静态卷PV。

      kubectl create -f model-oss.yaml

      以下为创建静态卷PVmodel-oss.yaml示例文件,需要指定Bucket、URL等参数。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: model-oss
        labels:
          alicloud-pvname: model-oss
      spec:
        capacity:
          storage: 30Gi 
        accessModes:
          - ReadOnlyMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: model-oss
          nodePublishSecretRef:
            name: oss-secret
            namespace: default
          volumeAttributes:
            bucket: "<Your_Bucket_Name>"
            url: "<Your_OSS_Endpoint>" # 本文的URLoss-cn-hangzhou.aliyuncs.com。
            otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
            path: "/"
    3. 执行以下命令,创建静态卷PVC。

      kubectl create -f model-pvc.yaml

      以下为创建静态卷PVCmodel-pvc.yaml示例文件。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: model-pvc
      spec:
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 30Gi
        selector:
          matchLabels:
            alicloud-pvname: model-oss

    具体参数配置,请参见使用OSS静态存储卷

  4. 更新Helm Value。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

    3. Helm页面,找到部署的langchain-chatchat服务,单击操作列的更新,更改llm.model为新的模型名称,llm.modelPVC为存储新模型的PVC名称。模型名称及模型挂载路径请参见支持的模型列表

如何使用ECI Pod方式部署?

修改参数配置,将llm.pod.instanceTypechat.pod.instanceType设置为eci。ECI类型默认的AnnotationLabel配置如下。您可以参考文档ECI Pod Annotation查看Annotation的详细信息。

annotations:
  k8s.aliyun.com/eci-use-specs: ecs.gn6i-c8g1.2xlarge,ecs.gn6i-c16g1.4xlarge,ecs.gn6v-c8g1.8xlarge,ecs.gn7i-c8g1.2xlarge,ecs.gn7i-c16g1.4xlarge
  k8s.aliyun.com/eci-extra-ephemeral-storage: "50Gi"
labels:
  alibabacloud.com/eci: "true"

如果您更改了镜像或者模型,则需要修改注解k8s.aliyun.com/eci-use-specsk8s.aliyun.com/eci-extra-ephemeral-storage,否则会产生因资源不足应用无法启动的问题。ECI产品计费请参考计费概述

如何加快文本向量化速度?

应用内置的embedding模型为text2vec-bge-large-chinese,详细信息,请参见text2vec-bge-large-chinese

chat应用默认使用CPU运行embedding模型,可通过在chat.pod.resources中申请GPU资源来提高文本向量化速度。

 resources:
   limits:
     nvidia.com/gpu: "1"
 requests:
   cpu: "4"
   memory: 8Gi
   nvidia.com/gpu: "1"

如何指定向量数据库类型?

支持的向量数据库包括faiss和阿里云云原生数据仓库AnalyticDB PostgreSQL

  • faiss是由Facebook开源的一款内存向量库,faiss内存数据库部署在chat pod中,受chat pod的资源约束。如果使用faiss向量数据库,建议增加chat pod的内存资源。

  • 云原生数据仓库AnalyticDB PostgreSQL是一种大规模并行处理(MPP)数据仓库服务,可提供海量数据的在线分析服务。

Langchain-chatchat项目中使用的ADB需要满足以下条件:

  • 需开启向量引擎优化功能。

  • 计算节点规格≥ 416 GiB。

  • 修改参数db.dbTypeadb,并填写db.adb中的数据库信息。

db:
 dbType: adb
 embeddingModel: text2vec-bge-large-chinese
 adb:
   pgHost: "pg.host.demo.com"
   pgPort: "5432"
   pgDataBase: "langchain"
   pgUser: "langchain"
   pgPassword: "pg_password"

如何修改服务副本数量?

llm.pod.replicas设置为需要的推理服务副本数量。

llm:
 model: qwen-7b-chat-aiacc
 modelPVC: "" # PVC名称。
 load8bit: true
 pod:
   replicas: 1 # 模型推理服务副本数量。

chat.pod.replicas设置为需要的应用服务副本数量。

chat:
 kbPVC: ""
 pod:
   replicas: 1 # 模型应用服务副本数量。

释放资源

使用ACK托管集群ProACK Serverless集群所费用包含两部分:

  • 集群管理费:由容器服务ACK直接计费。

  • 云资源费用:如GPU节点、存储等资源,按对应产品计费规则由各云服务计费。

完成本次实践部署后,您可根据需求选择以下步骤对集群进行处理:

  • 删除集群:若不再使用集群,登录容器服务管理控制台删除集群。关于删除ACK集群的更多信息,请参见删除集群

  • 继续使用:确保阿里云账号余额≥100元人民币。在使用ACK集群过程中用到的其他阿里云云产品资源的相关计费说明,请参见云产品资源费用

联系我们

如果您在ACK AIGC教程实践过程中有任何疑问或建议,欢迎您加入钉群(钉群号:31850017754)交流。