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

通过阿里云容器服务ACK集成推理引擎DeepGPU-LLM、云原生数据仓库AnalyticDB PostgreSQL等产品,基于开源本地知识库问答项目Langchain-Chatchat,快速构建检索增强生成(RAG)大模型知识库项目。

背景信息

  • DeepGPU-LLM是阿里云研发的基于GPU云服务器的大语言模型(Large Language Model,LLM)推理引擎,在处理大语言模型任务时,该推理引擎可以为您提供高性能的大模型推理服务。更多信息,请参见什么是推理引擎DeepGPU-LLM

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

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

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

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

前提条件

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

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

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

费用说明

如果您在使用ACK集群Pro版ACK 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实例

    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. 创建静态PV及PVC。

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

      kubectl create -f oss-secret.yaml

      以下为创建Secret的oss-secret.yaml示例文件,需要指定akId和akSecret。

      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

      以下为创建静态卷PV的model-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>" # 本文的URL为oss-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

      以下为创建静态卷PVC的model-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类型默认的Annotation及Label配置如下。您可以参考文档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需要满足以下条件:

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

  • 计算节点规格≥ 4核16 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集群Pro版ACK Serverless集群所产生的费用包括两部分。一部分是集群管理费用,由容器服务ACK收取。另一部分是所使用的其他阿里云云产品资源费用,按照各云产品规定的计费规则计费,由各云产品收取。完成该实践后,请参考以下场景处理集群。

  • 如果无需继续使用集群,请登录容器服务管理控制台删除集群。关于删除ACK集群的更多信息,请参见删除集群

  • 如果需要继续使用集群,请为阿里云账号充值,确保账户金额不小于100.00元人民币。在使用ACK集群过程中用到的其他阿里云云产品资源的相关计费说明,请参见云产品资源计费

联系我们

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