超详细教程!构建生产级别LLM推理环境

如何设置 TORCH_CUDA_ARCH_LIST 环境变量以优化 PyTorch 性能 本文将指导你如何确定你的 GPU 的 CUDA 架构能力,并设置相应的环境变量。这个列表告诉 PyTorch 你的 GPU 支持的 CUDA 版本,以便正确编译和优化 PyTorch 代码。设置好环境变量后,你就可以开始构建针对特定 CUDA 架构优化的 PyTorch 版本了。这将返回一个元组,包含两个整数,分别代表你的 GPU 支持的 CUDA 架构的主版本号和次版本号。首先,你需要知道你的 GPU 支持的 CUDA 计算能力。一旦你知道了你的 GPU 的 CUDA 架构能力,你就可以设置。 阅读详情

背景介绍

在企业场景中,LLM可以被应用于多个领域,例如智能问答、文本摘要、内容创作、代码生成等,为提高工作效率、优化客户体验等带来全新的可能性。越来越多的企业开始探索将LLM引入业务环境中。然而,企业在自有环境中部署和运行LLM面临诸多挑战:

  1. 部署复杂性:LLM模型通常规模庞大,需要大量算力资源,部署运维较为困难。
  2. 扩展性限制:企业难以随着业务发展灵活扩展LLM推理服务的计算资源。
  3. 可观测性缺失:缺乏对LLM服务的监控和运维能力,难以保证服务质量。
  4. 存储管理成本高:LLM模型文件往往体量庞大,分布式存储和管理成本高昂。

如何在企业自有环境中平滑部署并高效运行LLM,满足业务需求,是当前企业急需解决的问题。

总体架构

为解决企业在自有环境中部署和运行LLM面临的诸多挑战,我们提出了一种基于亚马逊云科技云原生服务的解决方案。该解决方案旨在为企业提供一个生产级别的LLM推理环境,具备良好的扩展性、可观测性以及存储管理能力。**整体架构设计遵循云原生的理念,充分利用了亚马逊云科技的各种托管服务和开源工具,构建了一个可靠、可扩展、易于管理和可观测的LLM部署运行平台。**架构图如下所示:

图片

我们可以从4个层面来看这个架构设计,分别是基础设施、服务网格、应用和可观测性。基础设施层提供了云原生的资源管理能力;服务网格层负责流量管控和部署策略;应用层包含了LLM推理的核心功能;而可观测性层则确保了整个平台的可视化和可维护性。每层的具体组件和作用如下:

1

基础设施层

  • Amazon EKS作为Kubernetes集群的基础承载层。
  • Amazon Elastic Load Balancer提供应用层负载均衡能力。
  • Amazon EFS统一管理LLM模型数据持久化存储。
  • Amazon Karpenter实现计算资源的弹性伸缩。

2

服务网格层

  • Kong作为API网关,实现流量控制和基本认证。
  • Istio Service Mesh支持灰度和金丝雀发布等。

3

应用层

  • 自研应用网关层处理请求转发及适配。
  • Text Generation WebUI、vLLM和Text Generation Inference等开源方案作为LLM推理引擎(算力单元)。

4

可观测性层

  • Prometheus、Grafana、Loki实现指标和日志监控。
  • KubeSphere和KubeCost提供集群管理和费用管控能力。

使用该方案用户只需专注于LLM模型的选型和应用,底层的基础设施和运维管理完全由解决方案自动化处理,大幅降低了LLM服务的运维复杂度。同时该方案具备水平扩展能力,能够随时根据业务发展灵活扩缩容LLM推理资源,保证高性能和高可用,还提供可观测性能力,确保服务质量,统一的LLM模型存储也使得存储管理更加便捷高效。整体部署方案代码和配置已经发布在Github仓库,可查看下方链接。

Github仓库

https://github.com/GlockGao/llm-on-eks.git

创新点

作为大语言模型在企业级场景落地的先驱性实践,我们的解决方案在多个技术层面做出了创新,以确保LLM服务的高性能、高可靠以及良好的运维体验:

1.算力单元支持多种开源框架,包括Text Generation WebUI、vLLM和Text Generation Inference等,并且对开源LLM框架Text Generation WebUI进行改造,支持在Kubernetes环境下运行。

原生的Text Generation WebUI项目是为单机环境设计的,不支持在Kubernetes集群中部署运行。我们对其进行了深度定制化改造,使其能在Kubernetes环境下顺利部署和运行。主要的改造工作包括:

  • 封装成Docker容器化应用,实现无状态部署。
  • 将模型数据持久化到外部存储(Amazon EFS),解除和宿主机的耦合。
  • 优化配置加载和资源请求方式,适配Kubernetes的调度机制。
  • 修改日志输出,与Kubernetes日志收集组件对接。

\2. 支持利用Amazon Neuron芯片加速LLM推理。

大语言模型的计算复杂度很高,对算力需求极大。利用亚马逊云科技推出的Amazon Neuron芯片 (Amazon Inferentia和Amazon Trainium),可以大幅降低推理的延迟和成本。然而原生的Text Generation WebUI并不支持直接使用这种加速芯片。我们对其进行了以下关键改造:

  • 修改模型加载模块,添加新的加载器以支持Amazon Neuron SDK。
  • 重构推理逻辑,使用Amazon Neuron的Python API进行推理计算。
  • 优化显存使用策略,充分发挥Amazon Neuron芯片的算力。

\3. 构建统一的LLM应用网关层。

为了实现LLM服务的高可用、可扩展,我们自研了一个应用网关层,作为与LLM推理引擎的适配层。该网关层由Golang语言编写,基于Fiber框架构建,充当反向代理,接收客户端请求并进行协议转换和负载分发。网关层的主要创新点有:

  • 内置服务发现机制,自动探索可用的LLM推理实例。
  • 实现请求级别的负载均衡和故障转移策略。
  • 支持限流、认证等网关常见功能。
  • 提供统一的指标和日志输出,与监控系统集成。

实施步骤

前提条件

1.安装kubectl。

ARCH=amd64
PLATFORM=$(uname -s)_$ARCH
curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"
curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check
tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz
sudo mv /tmp/eksctl /usr/local/bin
eksctl version

左右滑动查看完整示意

2.安装eksctl。

# 下载1.28版本
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.5/2024-01-04/bin/linux/amd64/kubectl

# 下载验证文件
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.5/2024-01-04/bin/linux/amd64/kubectl.sha256

# 验证sha
256sum -c kubectl.sha256

# 更改执行
chmod +x ./kubectl

mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH

# 设置PATH环境变量
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

# 查看版本
kubectl version --client

左右滑动查看完整示意

3.安装helm。

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
helm version

左右滑动查看完整示意

4.安装Amazon CLI、配置亚马逊云科技权限。

5.创建Amazon EKS集群。

  • 集群创建配置文件eks-cluster.yaml,下述配置以us-west-2、1.28版本为例,可以根据需要自行配置。

在这里插入图片描述

左右滑动查看完整示意

  • 创建集群命令。
eksctl create cluster -f eks-cluster.yaml

左右滑动查看完整示意

准备基础环境

安装Amazon Load Balancer Controller

1.创建OIDC Provider,需配置CLUSTER_NAME。

export cluster_name=${CLUSTER_NAME}
eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

左右滑动查看完整示意

2.获取并创建IAM Policy。

# 获取IAM Policy
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.0/docs/install/iam_policy.json

# 创建IAM Policy
aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \    
    --policy-document file://iam-policy.json

左右滑动查看完整示意

3.创建Service Account,需配置CLUSTER_NAME、REGION和ACCOUNT_ID等信息。

export cluster_name=${CLUSTR_NAME}
export region=${REGION}
export AWS_ACCOUNT_ID=${ACCOUNT_ID}

eksctl create iamserviceaccount \
  --cluster=$cluster_name \  
  --namespace=kube-system \  
  --name=aws-load-balancer-controller \  
  --attach-policy-arn=arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \  
  --override-existing-serviceaccounts \  
  --region $region \  
  --approve

左右滑动查看完整示意

4.添加并helm repo。

helm repo add eks https://aws.github.io/eks-charts
helm repo update eks

左右滑动查看完整示意

5.安装Amazon Load Balancer Controller。

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \  
  --set clusterName=$cluster_name \  
  --set serviceAccount.create=false \  
  --set serviceAccount.name=aws-load-balancer-controller

左右滑动查看完整示意

安装Amazon EFS Driver

1.下载并创建Amazon IAM Policy。

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
aws iam create-policy \
    --policy-name EKS_EFS_CSI_Driver_Policy \    
    --policy-document file://iam-policy-example.json

左右滑动查看完整示意

2.创建Service Account,需配置CLUSTER_NAME信息。

export cluster_name=${CLUSTER_NAME}
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \    
    --namespace kube-system \    
    --cluster $cluster_name \    
    --role-name $role_name \    
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \   
    --approve
TRUST_POLICY=$(aws iam get-role --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"

左右滑动查看完整示意

3.添加并更新helm repo。

# 1. 添加helm repo
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/

# 2. 更新helm repo
helm repo update aws-efs-csi-driver

左右滑动查看完整示意

4.安装Amazon EFS Driver。

helm upgrade --install aws-efs-csi-driver --namespace kube-system aws-efs-csi-driver/aws-efs-csi-driver \
  --set controller.serviceAccount.create=false \  
  --set controller.serviceAccount.name=efs-csi-controller-sa

左右滑动查看完整示意

5.安装Amazon EFS Storage Class。

  • 配置文件efs-sc.yaml。

在这里插入图片描述

  • 部署命令。
kubectl apply -f efs-sc.yaml

安装Amazon EBS Driver

1.创建Service Account,需配置CLUSTER_NAME和ACCOUNT_ID信息。

export cluster_name=${CLUSTER_NAME}
export AWS_ACCOUNT_ID=${ACCOUNT_ID}

eksctl create iamserviceaccount \
    --name ebs-csi-controller-sa \    
    --namespace kube-system \    
    --cluster $cluster_name \    
    --role-name AmazonEKS_EBS_CSI_DriverRole \    
    --role-only \    
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \    
    --approve

左右滑动查看完整示意

2.安装Amazon EBS Driver。

eksctl create addon --name aws-ebs-csi-driver --cluster $cluster_name --service-account-role-arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/AmazonEKS_EBS_CSI_DriverRole  --force

左右滑动查看完整示意

3.安装 EBS Storage Class。

  • 配置文件ebs-sc.yaml。

在这里插入图片描述

  • 安装命令。
kubectl apply -f gp3-sc.yaml

安装Karpenter

  1. Karpenter主要用于Amazon EKS集群的CA扩展。
  2. Karpenter的安装主要包括两种方式:直接安装(适用于创建全新集群)和Migration(适用于集群已经存在)。
  3. 文章中采用第二种方式安装Karpenter,具体步骤参考下方链接。
  4. 集群安装完成后需创建NodePool以指导Karpenter如何扩缩集群,示例如下:

具体步骤

https://karpenter.sh/docs/getting-started/migrating-from-cas/

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  template:  
    spec:     
      requirements:      
        - key: kubernetes.io/arch        
          operator: In          
          values: ["amd64"]        
        - key: kubernetes.io/os          
          operator: In          
          values: ["linux"]        
        - key: karpenter.sh/capacity-type       
          operator: In          
          values: ["spot"]      
        - key: karpenter.k8s.aws/instance-category      
          operator: In          
          values: ["r"]       
        - key: karpenter.k8s.aws/instance-generation        
          operator: Gt          
          values: ["5"]      
      nodeClassRef:      
        name: default  
  limits:  
    cpu: 1000  
  disruption:  
    consolidationPolicy: WhenUnderutilized    
    expireAfter: 720h # 30 * 24h = 720h
---
apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiFamily: AL2 # Amazon Linux 2  
  role: "KarpenterNodeRole-eks-cluster-prod" # replace with your cluster name  
  subnetSelectorTerms:  
    - tags:      
        karpenter.sh/discovery: eks-cluster-prod # replace with your cluster name  securityGroupSelectorTerms:    
    - tags:      
        karpenter.sh/discovery: eks-cluster-prod # replace with your cluster name

左右滑动查看完整示意

准备控制面环境

安装KubeSphere

1.下载安装文件。

wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/cluster-configuration.yaml

左右滑动查看完整示意

2.安装命令。

kubectl apply -f kubesphere-installer.yaml

左右滑动查看完整示意

3.监控安装进程。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

左右滑动查看完整示意

4.查看安装结果。

kubectl get svc -n kubesphere-system

5.查看UI页面:对应ks-console服务。

图片

安装KubeCost

1.安装命令。

helm upgrade -i kubecost oci://public.ecr.aws/kubecost/cost-analyzer --version 2.0.2 \
    --namespace kubecost --create-namespace \    
    -f https://raw.githubusercontent.com/kubecost/cost-analyzer-helm-chart/develop/cost-analyzer/values-eks-cost-monitoring.yaml

左右滑动查看完整示意

2.查看安装结果。

kubectl get svc -n kubecost

3.查看UI页面:对应kubecost-cost-analyzer服务。

图片

安装Prometheus和Grafana

1.添加并更新helm repo。

helm repo add prometheus-community https://prometheus-community.github.io/
helm-chartshelm repo update

左右滑动查看完整示意

2.安装Prometheus Stack。

# 1. 创建命名空间 - monitoring
kubectl create ns monitoring

# 2. 安装prometheus stack
helm install eks-kube-prometheus-stack prometheus-community/kube-prometheus-stack -n monitoring

左右滑动查看完整示意

3.查看安装情况。

kubectl get svc -n monitoring

4.查看UI页面。

  • Prometheus。

图片

  • Grafana。

图片

安装Loki

1.Loki架构如下,可以理解为类Prometheus,只不过存储的是日志而不是指标,Loki非常轻量级且适配K8s,数据可以存储到Amazon S3实现存算分离架构。

图片

2.添加并更新helm repo。

helm repo add grafana https://grafana.github.io/
helm-chartshelm repo update

左右滑动查看完整示意

3.创建配置文件loki-custom-values.yaml,示例如下,可以根据具体情况进行配置。

在这里插入图片描述

左右滑动查看完整示意

4.安装Loki,此处选择安装5.42.2版本。

helm upgrade loki --values loki-custom-values.yaml --namespace loki grafana/loki --version 5.42.2

左右滑动查看完整示意

5.安装Promtail。

helm install promtail --namespace loki grafana/promtail

左右滑动查看完整示意

6.登录Grafana查看应用日志,下图是访问应用网关时打印的日志。

图片

准备数据面环境

安装Kong

1.安装Gateway和GatewaClass。

  • 配置文件–gateway.yaml。

在这里插入图片描述

左右滑动查看完整示意

  • 安装命令。
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
kubectl apply -f gateway.yaml

左右滑动查看完整示意

2.添加并更新helm repo。

helm repo add kong https://charts.konghq.com
helm repo update

左右滑动查看完整示意

3.安装Kong。

helm install kong kong/ingress. -n kong --create-namespace

左右滑动查看完整示意

部署服务网格

1.添加helm repo并更新。

helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update

左右滑动查看完整示意

kubectl create namespace istio-system

左右滑动查看完整示意

3.安装istio-base。

helm install istio-base istio/base -n istio-system --set defaultRevision=default

左右滑动查看完整示意

4.安装istio discovery。

helm install istiod istio/istiod -n istio-system --wait

左右滑动查看完整示意

5.安装ingress gateway。

  • 配置文件ingressgateway.yaml。
service:
  annotations: 
    service.beta.kubernetes.io/aws-load-balancer-type: "external"    
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"    
    service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"    
    service.beta.kubernetes.io/aws-load-balancer-attributes: "load_balancing.cross_zone.enabled=true"

左右滑动查看完整示意

  • 安装命令。
helm install istio-ingressgateway istio/gateway -n istio-system -f ingressgateway.yaml

左右滑动查看完整示意

6.安装istio对应的add-on。

for ADDON in kiali jaeger prometheus grafana
do
    ADDON_URL="https://raw.githubusercontent.com/istio/istio/release-1.20/samples/addons/$ADDON.yaml"    
    kubectl apply -f $ADDON_URL
done

左右滑动查看完整示意

7.使用Kiali查看部署的应用:此处部署的Service仅作演示目的。

图片

部署应用网关

1.应用官方是使用Fiber框架、Go语言开发的应用网关,项目github(后续集成到Amazon-examples中并开源)。

2.应用网关可以响应客户端请求、适配后端算力单元(例如Text Generation WebUI+Nvidia GPU)组成的大语言模型推理框架、记录API调用日志和指标并以此实现算力单元的自动扩缩。

3.下载代码后编译镜像。

./scripts/build_and_push.sh

4.部署Service,需要根据情况更改Image。

  • 配置文件service-text-generation-webui-proxy.yaml。

在这里插入图片描述在这里插入图片描述

左右滑动查看完整示意

  • 部署命令。
kubectl apply -f service-text-generation-webui-proxy.yaml

左右滑动查看完整示意

5.查看部署的Service。

kubectl get all -l app=text-generation-webui-proxy

左右滑动查看完整示意

图片

6.配置Kong Route,使得Kong接收到的请求转发给该应用网关达到暴露服务的目的。

  • 配置文件kong-route-ingress.yaml。

在这里插入图片描述

左右滑动查看完整示意

  • 命令。
kubectl apply -f kong-route-ingress.yaml

部署Text Generation WebUI

1.Text Generation WebUI是最近比较热门的开源项目,目标是LLM界的SD-WebUI ,目前部分客户已经使用其作为LLM的推理框架。

2.原生Text Generation WebUI不支持K8s和Amazon Neuron芯片进行部署。因此该方案针对上述两个方面进行了优化,使得Text Generation WebUI可以部署于K8s且对部分支持的模型可以使用Amazon Neuron芯片作为推理引擎。

3.Amazon Neuron芯片支持,核心修改如下:

  • modules和models.py加入neuron_loader()以支持使用Amazon Neuron芯片加载模型。
def neuron_loader(model_name):
    from transformers_neuronx.llama.model import LlamaForSampling
    
    path_to_model = Path(f'{shared.args.model_dir}/{model_name}/model')    
    path_to_neuron = Path(f'{shared.args.model_dir}/{model_name}/neuron_artifacts')    
    path_to_tokenizer = Path(f'{shared.args.model_dir}/{model_name}/tokenizer')
    
    model = LlamaForSampling.from_pretrained(path_to_model, batch_size=1, tp_degree=12, amp='f16')    
    model.load(path_to_neuron) # Load the compiled Neuron artifacts    
    model.to_neuron() # will skip compile
    
    tokenizer = AutoTokenizer.from_pretrained(path_to_tokenizer)
    
    return model, tokenizer  


def load_model(model_name, loader=None):
    logger.info(f"Loading {model_name}")    
    t0 = time.time()
    
    shared.is_seq2seq = False    
    shared.model_name = model_name    
    load_func_map = {   
        'Transformers': huggingface_loader,        
        'AutoGPTQ': AutoGPTQ_loader,        
        'GPTQ-for-LLaMa': GPTQ_loader,        
        'llama.cpp': llamacpp_loader,        
        'llamacpp_HF': llamacpp_HF_loader,        
        'RWKV': RWKV_loader,        
        'ExLlama': ExLlama_loader,        
        'ExLlama_HF': ExLlama_HF_loader,        
        'ExLlamav2': ExLlamav2_loader,        
        'ExLlamav2_HF': ExLlamav2_HF_loader,        
        'ctransformers': ctransformers_loader,        
        'AutoAWQ': AutoAWQ_loader,        
        'QuIP#': QuipSharp_loader,        
        'HQQ': HQQ_loader,        
        'Neuron': neuron_loader    
    }

左右滑动查看完整示意

  • modules和models_setting.py,修改模型设置以支持采用neuron_loader进行模型加载。
def infer_loader(model_name, model_settings):
    path_to_model = Path(f'{shared.args.model_dir}/{model_name}')    
    if not path_to_model.exists():     
        loader = None    
    elif (path_to_model / 'quantize_config.json').exists() or ('wbits' in model_settings and type(model_settings['wbits']) is int and model_settings['wbits'] > 0):     
        loader = 'ExLlama_HF'    
    elif (path_to_model / 'quant_config.json').exists() or re.match(r'.*-awq', model_name.lower()):        
        loader = 'AutoAWQ'    
    elif len(list(path_to_model.glob('*.gguf'))) > 0:     
        loader = 'llama.cpp'    
    elif re.match(r'.*\.gguf', model_name.lower()):    
        loader = 'llama.cpp'    
    elif re.match(r'.*rwkv.*\.pth', model_name.lower()):     
        loader = 'RWKV'    
    elif re.match(r'.*exl2', model_name.lower()):    
        loader = 'ExLlamav2_HF'    
    elif re.match(r'.*-hqq', model_name.lower()):   
        return 'HQQ'    
    elif re.match(r'.*-neuron', model_name.lower()):     
        return 'Neuron'    
    else:     
        loader = 'Transformers'
        
    return loader

左右滑动查看完整示意

  • modules和text_generation.py,修改encode()函数,不使用CUDA device加载。
def encode(prompt, add_special_tokens=True, add_bos_token=True, truncation_length=None):
    ...    
    return input_ids

左右滑动查看完整示意

  • modules和text_generation.py,修改generate_reply_HF()函数,使用Amazon Neuron SDK进行模型推理。

在这里插入图片描述

左右滑动查看完整示意

4.K8s支持。

  • 生成.dockerfile文件。
# BUILDERFROM 
nvidia/cuda:12.1.1-devel-ubuntu22.04 as builder
WORKDIR /builder
ARG TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST:-3.5;5.0;6.0;6.1;7.0;7.5;8.0;8.6+PTX}"
ARG BUILD_EXTENSIONS="${BUILD_EXTENSIONS:-}"
ARG APP_UID="${APP_UID:-6972}"
ARG APP_GID="${APP_GID:-6972}"

RUN apt update && \
    apt install --no-install-recommends -y git vim build-essential python3-dev pip bash curl net-tools && \    
    rm -rf /var/lib/apt/lists/*
WORKDIR /home/app/
# RUN git clone https://github.com/oobabooga/text-generation-webui.git
COPY . /home/app/text-generation-webui
WORKDIR /home/app/text-generation-webui
RUN GPU_CHOICE=A USE_CUDA118=FALSE LAUNCH_AFTER_INSTALL=FALSE INSTALL_EXTENSIONS=TRUE ./start_linux.sh --verbose
# COPY CMD_FLAGS.txt /home/app/text-generation-webui/
EXPOSE ${CONTAINER_PORT:-7860} ${CONTAINER_API_PORT:-5000} ${CONTAINER_API_STREAM_PORT:-5005}
WORKDIR /home/app/text-generation-webui
# set umask to ensure group read / write at runtime
CMD umask 0002 && export HOME=/home/app/text-generation-webui && ./start_linux.sh

左右滑动查看完整示意

  • 生成镜像并上传–bash脚本。
#!/usr/bin/env bash

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 763104351884.dkr.ecr.us-west-2.amazonaws.com

# This script shows how to build the Docker image and push it to ECR to be ready for use
# by SageMaker.

# The argument to this script is the image name. This will be used as the image on the local
# machine and combined with the account and region to form the repository name for ECR.
# The name of our algorithmalgorithm_name=text-generation-webui

account=$(aws sts get-caller-identity --query Account --output text)

# Get the region defined in the current configuration (default to us-west-2 if none defined)
region=$(aws configure get region)
region=${region:-us-west-2}

fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest"

# If the repository doesn't exist in ECR, create it.
aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1

if [ $? -ne 0 ]
then
    aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null
fi

# Get the login command from ECR and execute it directly
aws ecr get-login-password --region ${region}|docker login --username AWS --password-stdin ${fullname}

# Build the docker image locally with the image name and then push it to ECR
# with the full name.

docker build -t ${algorithm_name} .
docker tag ${algorithm_name} ${fullname}

docker push ${fullname}

左右滑动查看完整示意

5.部署服务。

  • 配置文件(service-text-generation-webui.yaml):根据具体情况修改Image和Amazon EFS Claim。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

  • 将模型文件下载并拷贝到Amazon EFS对应路径,例如截图中是“TheBloke_Llama-2-7B-Chat-AWQ”模型。

图片

  • 部署命令。
kubectl apply -f service-text-generation-webui.yaml

左右滑动查看完整示意

集群自动扩缩

1.大语言模型推理的自动扩缩是一个比较复杂的问题,需要考虑方方面面的因素,包括但不限于底层的算力机类型、模型的大小、模型是否量化、输入和输出Token数量、推理的参数设定以及特定框架的参数等,因此设计一个适配各种场景的完美方案非常困难。比较合理的扩缩指标信息包括“单位时间请求数”、“请求响应时长”等。

2.本方案中采用“单位时间请求数”作为Kubernetes deployment扩缩的依据,下面以Text Generation Inference为例讲解,配置文件如下。由于只是作为展示,因此设置的扩展指标非常敏感–每2秒有一个请求就会扩展。生产中应根据实际情况配置。

kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2
metadata:
  name: llama2-13b-chat-awq  
  namespace: tgi
spec:
  scaleTargetRef:
    apiVersion: apps/v1    
    kind: Deployment    
    name: tgi-engine-llama2-13b-chat-awq  
  minReplicas: 1  
  maxReplicas: 3  
  metrics:  
  # use a "Pods" metric, which takes the average of the  
  # given metric across all pods controlled by the autoscaling target  
  - type: Pods  
    pods:    
      metric:     
        name: tgi_request_per_second      
      # target 500 milli-requests per second,      
      # which is 1 request every two seconds      
      target:       
        type: Value        
        averageValue: 500m  
  behavior: # 这里是重点  
    scaleDown:    
      stabilizationWindowSeconds: 300 # 需要缩容时,先观察5分钟,如果一直持续需要缩容才执行缩容      
      policies:      
      - type: Percent     
        value: 100 # 允许全部缩掉        
        periodSeconds: 15    
    scaleUp:    
      stabilizationWindowSeconds: 0 # 需要扩容时,立即扩容      
      policies:      
      - type: Percent       
        value: 100        
        periodSeconds: 15 # 每15s最大允许扩容当前1倍数量的Pod     
      - type: Pods       
        value: 4        
        periodSeconds: 15 # 每15s最大允许扩容 4 个 Pod      
      selectPolicy: Max # 使用以上两种扩容策略中算出来扩容Pod数量最大的

左右滑动查看完整示意

3.查看相关Deployment初始配置–此时没有任何请求,初始值为0。

在这里插入图片描述

4.当压力增加,自动扩展deploy的pod数量,同时通过Karpenter出发点集群节点的扩展。

图片

5.当压力下降持续5分钟后,pod自动进行收缩,同时通过Karpenter触发集群节点的收缩。

图片

方案验证

1.目前方案提供了HTTP接口( OpenAI-Compatible )以便于调用LLM推理能力。

2.调用命令v1/completions/接口。

在这里插入图片描述

左右滑动查看完整示意

3.调用截图。

图片

总结

通过这个基于亚马逊云科技云原生服务的解决方案,我们为企业在自有环境中平滑部署和高效运行大型语言模型提供了一种创新的实践方式。该解决方案遵循云原生理念,融合了多种亚马逊云科技基础服务和开源工具,构建了一个功能完备、灵活可扩展、易于运维的LLM部署运行平台。

在技术层面,我们将开源LLM框架Text Generation WebUI、vLLM和Text Generation Inference部署于Amazon EKS集群实现LLM的推理,同时对开源LLM框架Text Generation WebUI进行了多方位的创新改造,使其能够在Amazon EKS集群中稳定运行,同时充分利用Amazon Neuron加速芯片的算力,极大提升了推理性能。另外,我们自研的统一LLM应用网关层为服务注入了高可用、负载均衡等生产级能力,形成了一个端到端的LLM部署和运维体系,显著降低了企业应用LLM能力的复杂度和总体拥有成本。

​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

LLM 推理卡顿?vLLM 核心技术原理 + 最佳实战全攻略:让你的大模型推理飞起来! vLLM 是一款专为大语言模型推理优化的高性能推理引擎,凭借创新的 PagedAttention 技术与动态批处理机制,在提升吞吐量、降低延迟、节省显存方面表现卓越。本文将深入剖析 vLLM 的核心架构设计原理,包括其对 KV Cache 管理的优化策略、多请求并发调度方式以及对 OpenAI 接口协议的兼容能力。同时,文章还将手把手带你完成 vLLM 的本地部署、API 启动、模型调用等实战操作,帮助你快速构建一个响应迅速、资源友好的大模型推理服务。无论你是构建私有化 LLM 服务,还是开发 RAG 系统 阅读详情

相关推荐

大模型推理框架 RTP-LLM Embedding 技术揭秘

我们基于 RTP-LLM 实现了 Embedding 框架,支持部署 Transformer 结构的 Embedding 模型及其下游任务(Reranker/Classifier),在请求上支持 HTTP/ARPC/GRPC 协议,在部署上支持用户使用 SentenceTransformer 自定义后处理逻辑。Embedding 引擎已服务了淘宝主搜等多个在离线场景,并成功度过双十一洪峰。

阿里技术 1945

【亲测免费】 vLLM Production Stack 使用教程

vLLM Production Stack 是一个开源项目,旨在为用户提供一个基于 Kubernetes 的 vLLM 部署参考实现。该项目允许用户从单个 vLLM 实例无缝扩展到分布式部署,无需更改任何应用程序代码。它还提供了性能监控、请求路由和 KV 缓存卸载等功能,以优化大规模语言模型的推理性能。 ## 2. 项目快速启动 在开始之前,请确保您已经安装了 Kubernetes 环境并且已...

gitblog_00076的博客 874

LLM推理部署(二):英伟达LLM推理部署工具TensorRT-LLM

在大模型时代,各大公司在陆续推出和优化各自的底座大模型,不断刷新榜单,然而大模型的超大参数给生产部署带来了很大的困难,由此也带来大模型部署框架的蓬勃发展(可以参考之前写的。

wshzd的博客 2496

production-stack:构建高效大型语言模型部署的参考堆栈

在人工智能技术飞速发展的今天,如何高效地部署和扩展大型语言模型(LLM)成为了一个关键问题。**vLLM Production Stack** 项目正是为了解决这个问题而诞生。它提供了一个在 vLLM(一个开源大型语言模型框架)之上构建推理堆栈的参考实现,用户可以轻松地将单个 vLLM 实例扩展到分布式部署,而无需更改任何应用代码。通过集成的监控和性能优化功能,**vLLM Production ...

gitblog_00836的博客 569

MATLAB对pcap文件抓包的读取

应用范围 常用的雷达信号,无线网通信信号的格式大多为pcap、wj文件,这里记录一下MATLAB读取pcap文件的方法,具体处理过程及读取协议针对不同的雷达有不同的处理方式,在这里不做说明。 程序 clc;clear;close all; %% 文件位置 filename= 'E:\File\JOB\JOB_1\data.pcap'; fid = fopen(filename,'r'); % 打开包 tmpPack = fread(fid,1350); % 只读前1350个数 读到

诗酒趁年华的博客 3582

C51:PWM+舵机角度控制

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.脉冲宽度调制通过占空比编码模拟信号一个周期内,高电平占据时长的百分比如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。

qq_73379310的博客 3390

通过vllm-production-stack部署Deepseek Distill model 完整流程教学

通过vllm-production-stack 部署Deepseek Distill Model 完整流程教学

qq_37806441的博客 1035

硬件基础(4):(7)ADC电压采集:软件校准(标定、拟合)

在实际项目中,**软件端校准**可以有效弥补硬件方面(分压电阻误差、放大器失调、参考源误差等)带来的系统性偏差,从而提高 ADC 测量精度。下面是一个常见的**多点实测校准**流程与思路,个人感觉传感器标定的原理也只这样。

FCZlll的博客 6246

bug】解决:nvcc fatal : Unsupported gpu architecture ‘compute_86‘

配置VisTR代码,编译下面这段代码报错 Compile DCN module(requires GCC>=5.3, cuda>=10.0) cd models/dcn python setup.py build_ext --inplace 本人环境: cuda11.6 ubuntu 20.04.1 算力8.6 RTX 3090 解决方案 错误原因: GPU 3090 算力是 8.6,而当前 CUDA 11.0 不支持算力 8.6。 解决方案: 设置环境变量,降低算力要求。 打开配置文件 v

qq_43431863的博客 2503

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1183

YOLOv11安卓端部署终极指南:从训练到NCNN移植,30分钟搞定手机实时检测!

本文详细介绍了YOLOv11模型在安卓设备上的NCNN部署全流程。主要内容包括:1) 环境配置要求(Python3.8+、PyTorch、NCNN框架等);2) COCO2017数据集准备与配置;3) 模型训练建议(使用RTX3090,50-100个epoch);4) 模型导出转换步骤(ONNX格式转换、NCNN优化);5) 安卓端实现的关键优化(快速sigmoid实现、纯C++NMS等)。项目在安卓CPU模式下可实现20FPS的稳定检测,并提供了激活函数选择、模型量化等性能调优建议。通过参考多个开源项目,

FJN110的博客 1726

基于亚马逊云科技云原生服务,构建生产级别的 LLM 推理环境

背景介绍近年来,随着计算力和数据量的不断提升,大语言模型( LLM )在自然语言处理领域取得了令人瞩目的进展,展现出了广阔的应用前景。在企业场景中,LLM 可以被应用于多个领域,例如智能问答、文本摘要、内容创作、代码生成等,为提高工作效率、优化客户体验等带来全新的可能性。越来越多的企业开始探索将 LLM 引入业务环境中。然而,企业在自有环境中部署和运行 LLM 面临诸多挑战:部署复杂性:LLM 模...

亚马逊云科技专栏 569

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 176

使用 TensorRT LLM 将 LLM 部署到生产环境

开源的大型语言模型已经兑现了其炒作的承诺。许多使用 GPT-3.5 或 GPT-4 进行生产的公司已经意识到,这些模型在成本角度上根本不可扩展。因此,企业正在寻找更好的开源替代方案。最近的模型,如 Mixtral 和 Llama 2,在输出质量方面表现出色。但将这些模型扩展到支持数千个并发用户仍然是一个挑战。虽然像vLLM和TGI这样的框架在提升推理方面是一个很好的起点,但它们缺乏一些优化,导致它们在生产环境中的扩展性较差。这就是的作用所在。

龙哥盟 1096

【ARM AMBA5 CHI 2 -- CHI 链路层详细介绍 】

目前有六个版本的 CHI 协议,CHI-A 是 CHI 协议的第一个版本。它提供了一个传输层,具有减少拥塞的功能。新通道、CHI 术语和组件命名的定义;请求、监听过滤器和缓存状态转换的示例;事务排序、独占访问和分布式虚拟内存(DVM)操作的规则;CHI-B 问题扩展了 CHI-A,但不能直接向后兼容 CHI-A。更大的物理地址宽度;原子事务;DVM 的 VMID 扩展;通道字段、事务结构和可靠性、可用性和可维护性(RAS)特性的描述;

CodingCos的博客 2536

[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记

最近开始学习网络安全相关知识,接触了好多新术语,感觉自己要学习的东西太多,真是学无止境,也发现了好几个默默无闻写着博客、做着开源的大神。接下来系统分享一些网络安全的自学笔记,希望读者们喜欢。 上一篇文章分享了看雪Web安全总结知识和一个异或解密的示例,本篇文章着重讲解Chrome浏览器保留密码功能渗透解析及登录加密入门笔记,结合实际例子一步步实现浏览器漏洞的挖掘。非常基础的文章,希望对入门的博友们有帮助,大神请飘过,谢谢各位看官!

杨秀璋的专栏 2万+

在生产环境通过 TensorRT-LLM 部署 LLM

开源的大型语言模型确实达到了预期的效果。许多在生产环境中使用 GPT-3.5 或 GPT-4 的公司已经意识到,从成本角度来看,这些模型难以扩展。因此,企业正在寻找良好的开源替代方案。最近的模型如 Mistral 和 Llama 2 在输出质量方面表现出色。但是,将这些模型扩展以支持数千并发用户仍然是一个挑战。尽管像 vLLM 和 TGI 这样的框架是提升推理性能的一个很好的开端,但由于缺乏一些优化,很难在生产环境中对它们进行扩展。这就是 TensorRT-LLM 的用武之地。

m0_59235945的博客 2169

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Angthing LLM 实战指南:从模型部署到生产环境优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959896的博客 851

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

使用TensorRT-LLM进行生产环境的部署指南

在这篇文章中,我们演示了如何使用TensorRT LLM实现模型加速推理,文章内容涵盖了从编译LLM到在生产中部署模型的所有内容。虽然TensorRT LLM比其他推理优化器更复杂,但性能提高也是非常明显。虽然该框架仍处于早期阶段,但是可以提供目前最先进的LLM优化。并且它是完全开源的可以商业化,我相信TensorRT LLM以后还会有更大的发展,因为毕竟是NVIDIA自己的产品.作者:Het Trivedi。

deephub 6337

Anything LLM 实战安装教程:从零部署到生产环境避坑指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960114的博客 660

LLM 推理:Nvidia TensorRT-LLM 与 Triton Inference Server

从TensorRT-LLM+Triton这套方法的部署过程来看,还是较为复杂的,需要先对模型进行编译,还要特别注意环境、参数的设置,稍不注意就无法正常部署。除此之外,英伟达的文档也不够清晰。总体来说,学习成本比较高,但也带来了相对应的推理效果提升的收益(相对于vLLM在量化模型推理、以及token生成速度的场景)。但是,在模型推理场景下,推理效果也并不是唯一选择因素,其他例如框架易用性、不同底层硬件的支持,也需要根据实际情况进行考量,选择最合适推理引擎。

2401_85390073的博客 2402

Anthropic LLM论文精读:从理论到生产环境的实战应用指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960222的博客 660

TensorRT-LLM与FastAPI异步:高并发推理接口设计

当业务规模从实验室走向生产环境,你是否曾面临这些痛点:单用户请求阻塞整个服务、GPU资源利用率不足30%、峰值流量导致接口超时?TensorRT-LLM与FastAPI的异步架构组合,通过底层优化与异步编程范式的深度融合,可将并发吞吐量提升5-10倍,同时将平均响应时间缩短40%。本文将系统拆解这一架构的设计原理与实现细节,提供从原型开发到生产部署的完整指南。 读完本文你将掌握: - 异步推理接...

gitblog_00737的博客 1175

AIGC与LLM技术解析:从基础原理到生产环境实践

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960046的博客 633

Anything LLM 本地部署实战:从环境搭建到生产级优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960059的博客 642

Anything LLM 安装指南:从零搭建到生产环境避坑

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960030的博客 590
上一篇: Google如何做医疗大模型(Med-Gemini)
下一篇: 腾讯基于 LLM 的智能数据分析平台 OlaChat 的落地实践
冻感糕人~
博客等级 码龄3年 8926粉丝 2393原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值