【大模型】docker部署glm-4-9b-chat,并部署到服务器上

news2024/11/24 15:01:27

因为我们实验室的服务器不能联网,所以只能部署到docker里面,如果有需要补充的包只能在本地下载好了,再上传到服务器上进行离线安装。

dockerfile

# 使用pytorch镜像作为基础镜像
FROM pytorch/pytorch:2.2.1-cuda12.1-cudnn8-runtime
ARG DEBIAN_FRONTEND=noninteractive
# 设置工作目录
WORKDIR /app

# 更新包索引并安装必要工具
RUN apt-get update && apt-get install -y \
    openssh-server \
    vim \
    curl \
    git && \
    rm -rf /var/lib/apt/lists/*

# 安装Python依赖
RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
RUN  pip install jupyter  && \
     pip install --upgrade ipython && \
     ipython kernel install --user


# 安装Node.js 和 pnpm
RUN cd /tmp && \
    curl -fsSL https://deb.nodesource.com/setup_22.x -o nodesource_setup.sh && \
    bash nodesource_setup.sh && \
    apt-get install -y nodejs && \
    rm -rf nodesource_setup.sh && \
    node -v

RUN npm config set registry https://registry.npmmirror.com
RUN npm install -g pnpm
RUN node -v && pnpm -v

# 复制依赖到容器
RUN mkdir -p /app/GLM-4/composite_demo
RUN mkdir -p /app/GLM-4/basic_demo
RUN mkdir -p /app/GLM-4/finetune_demo

#COPY ./requirements.txt /app/GLM-4
COPY ./composite_demo/requirements.txt /app/GLM-4/composite_demo
COPY ./basic_demo/requirements.txt /app/GLM-4/basic_demo
COPY ./finetune_demo/requirements.txt /app/GLM-4/finetune_demo

# 安装GLM-4依赖
WORKDIR /app/GLM-4
RUN pip install --verbose --use-pep517 -r composite_demo/requirements.txt
RUN pip install --verbose --use-pep517 -r basic_demo/requirements.txt
RUN pip install --verbose --use-pep517 -r finetune_demo/requirements.txt
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install vllm>=0.5.2


# 暴露端口
EXPOSE 8501

构建和打包

# 构建镜像
docker build -t chatglm4:v1.0 .
# 运行容器(cpu)
docker run -it -p 8501:8501 chatglm4:v1.0 python
# 运行容器(gpu)
docker run --gpus all -p 8501:8501 chatglm4:v1.0 python
# 进入容器
docker run -it -p 8501:8501 chatglm4:v1.0 /bin/bash
# 查看容器ID
docker ps -a 
docker commit 368369a3c853【查到的ID】 ubuntu:test
# 导出为tar
docker image save ubuntu:test -o sl_sum.tar【名字】

部署到服务器上

直接运行

python -m vllm.entrypoints.openai.api_server --model /root/data1/GLM-4/ZhipuAI/glm-4-9b-chat  --served-model-name glm-4-9b-chat --max-model-len=2048 --trust-remote-code --dtype=half --port=8000

–host 和 --port 参数指定地址。
–model 参数指定模型名称。(我模型存放的位置在/root/data1/GLM-4/ZhipuAI/glm-4-9b-chat)
–chat-template 参数指定聊天模板。
–served-model-name 指定服务模型的名称。
–max-model-len 指定模型的最大长度。(glm-4-9B-chat默认最大长度为128k)

简单在命令行使用:
做了个端口映射:8000:18000

curl http://10.20.26.187:18000/v1/completions -H "Content-Type: application/json" -d "{\"model\": \"glm-4-9b-chat\", \"prompt\": \"可以介绍一下神经网络吗\", \"max_tokens\": 7, \"temperature\": 0}"

回复:

{"id":"cmpl-512bbfc33b874424a61385b15e75771c","object":"text_completion","created":1732022395,"model":"glm-4-9b-chat","choices":[{"index":0,"text":"?\n\n当然可以。神经网络是一种模仿","logprobs":null,"finish_reason":"length","stop_reason":null,"prompt_logprobs":null}],"usage":{"prompt_tokens":6,"total_tokens":13,"completion_tokens":7,"prompt_tokens_details":null}}

使用:

通过vllm:
简单使用的模板:

vllm 非流式
from openai import OpenAI
client = OpenAI(
    base_url="http://101.201.68.250:8082/v1",
    api_key="123", # 随便设,只是为了通过接口参数校验
)
# 设置提示词 
prompt_message = {"role": "system", "content": "你是一个专业的材料科学家。请详细解释什么是高温合金,并讨论它们的应用和特性。"} 


completion = client.chat.completions.create(
  model="glm4:9b-chat-fp16",
  messages=[
  
    {"role": "user", "content": "你好"}
  ],
  # 设置额外参数
  extra_body={
    "stop_token_ids": [151329, 151336, 151338]
  }
)

print(completion.choices[0].message) 

vllm流式
多卡推理需要用到
pip install nvidia-nccl-cu12==2.20.5


https://blog.csdn.net/weixin_46398647/article/details/139963697

import requests
from openai import OpenAI
url = "http://101.201.68.250:8082/v1/chat/completions"
headers = {
    "Content-Type": "application/json",
    "Authorization": "EMPTY"
}

data = {
    "model":  "glm-4-9b-chat",
    "messages": [{"role": "user", "content": "你是谁"}],
    "stream": True
}

response = requests.post(url, headers=headers, json=data, stream=True)
for chunk in response:
    if chunk:
        chunk = chunk.decode('utf-8',errors='ignore').strip()
        print(chunk)

# 分割
from flask import Flask, request, jsonify, Response
from urllib.parse import unquote
import requests

app = Flask(__name__)

# 假设这是你的OpenAI客户端和模型名称
client = OpenAI()  # 这个变量需要根据实际情况初始化
modelname = "glm-4-9b-chat"  # 根据实际使用的模型名称进行替换

@app.route('/operation_get_answer', methods=['GET'])
def get_answer():
    try:
        # 获取用户的问题
        question = request.args.get('question')
        if not question:
            return jsonify({"error": "缺少问题参数"}), 400

        # 解码问题
        decoded_question = unquote(question, encoding='utf-8')

        # 构建请求数据
        data = {
            "model": modelname,
            "messages": [{"role": "user", "content": decoded_question}],
            "stream": True
        }

        # 发送请求并获取流式响应
        url = "http://101.201.68.250:8082/v1/chat/completions"
        headers = {
            "Content-Type": "application/json",
            "Authorization": "EMPTY"  # 需要替换为实际的授权信息
        }

        def generate_stream_response():
            with requests.post(url, headers=headers, json=data, stream=True) as r:
                for chunk in r.iter_lines(chunk_size=1):
                    if chunk:
                        chunk_str = chunk.decode('utf-8', errors='ignore').strip()
                        yield f"data: {chunk_str}\n\n"

        # 返回流式响应
        return Response(generate_stream_response(), mimetype='text/event-stream')

    except Exception as e:
        app.logger.error(str(e))
        return jsonify({"error": "无法获取答案"}), 500

if __name__ == '__main__':
    app.run(debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷题——【模板】二维前缀和

前缀和 题目题目链接题解方法一方法二 题目 描述 给你一个 n 行 m 列的矩阵 A ,下标从1开始。 接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2 请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和, 输入描述&#x…

10 - Clickhouse集群部署以及副本和分片

目 一、副本 1、简介 2、副本写入流程 3、副本配置步骤 3.1、启动zookeeper集群 3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下: 3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如…

Ubuntu24.04LTS设置root用户可远程登录

Ubuntu24.04LTS设置root用户可远程登录 文章目录 Ubuntu24.04LTS设置root用户可远程登录1. 设置root密码2. 设置root用户可远程登录1. 查看ssh服务是否安装2. 安装ssh服务3. 再次查看ssh服务是否安装4. 配置ssh文件5. 重启ssh服务6. root远程登录 1. 设置root密码 Ubuntu安装后…

DMA理论篇

DMA理论篇 简介 传统的数据传输都是需要CPU来实现,从一个地方拷贝到另一个地方;而DMA(Direct Memory Access)则不完全依赖CPU,DMA更新芯片SOC的一个控制器,他可以控制数据从内存中传输到另一个地方(外设、soc其它模块)&#xff…

理解原子变量之三:原子性与memory_order_relaxed

目录 CPU与内存的关系 原子性 典型使用场景 在本系列的第一篇文章理解原子变量之一:从互斥锁到原子变量,最粗浅的认识_原子互斥-CSDN博客,我通过几个实例从感性认识的角度介绍了原子性。本文在第一篇文章的基础上,从理性认识的…

医院信息化与智能化系统(22)

医院信息化与智能化系统(22) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应…

青少年编程等级考试C++一级,硬币反转问题

代码 #include<iostream>using namespace std;bool a[300];int main(){ int n,m; cin >> n >> m; for(int i 1;i < m;i) { for (int j 1;j < n;j) { if( j % i 0) { a[j] !a[j];…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…

(十一)Python字符串常用操作

一、访问字符串值 Python访问子字符串变量&#xff0c;可以使用方括号来截取字符串。与列表的索引一样&#xff0c;字符串索引从0开始。 hh"LaoTie 666" hh[2] mm"床前明月光" mm[3] 字符串的索引值可以为负值。若索引值为负数&#xff0c;则表示由字符…

Sigrity SPEED2000 DDR simulation模式如何生成和解读DDR仿真报告-SODIMM-Write模式

Sigrity SPEED2000 DDR simulation模式如何生成和解读DDR仿真报告-SODIMM-Write模式 Sigrity SPEED2000 DDR simulation模式如何进行DDR仿真分析操作指导-SODIMM-Write模式详细介绍了如何进行DDR Write模式的仿真分析,下面基于此仿真结果进行DDR报告的输出和解读分析 在workfl…

【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)

识别逻辑 深度学习 使用了端到端的学习策略&#xff0c;直接学习从图像到检测结果的映射关系&#xff0c;自动提取特征&#xff0c;并且根据特征与特征之间的关系&#xff0c;计算出检测结果。 传统算法 则是人工提取特征&#xff0c;比如边缘特征&#xff0c;直线特征&#x…

TypeScript 系统学习 章节3

想学习 TypeScript 的小伙伴看过来&#xff0c;本文将带你一步步学习 TypeScript 入门相关的十四个知识点&#xff0c;详细的内容大纲请看下图&#xff1a; 一、TypeScript 是什么 TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c…

opencv undefined reference to `cv::noarray()‘ 。window系统配置opencv,找到opencv库,但连接不了

之前都是在ubuntu里用opencv&#xff0c;今天为了方便在平时用Window10系统也用下c版的cv&#xff0c;就想配置一下vscode的cv环境&#xff0c;直接下载了一个编译好的opencv库&#xff08;带build文件夹的&#xff09;&#xff0c;刚开始用的是visual studio的编译器&#xff…

利用FileZilla搭建ftp服务器

一 利用windows自带的ftp服务搭建服务器&#xff0c;要复杂一些&#xff0c;好处是无需借用外部软件。 也有一些好的工具&#xff0c;如FileZilla的Server版&#xff0c;构建过程简单&#xff0c;好用。 下面看看。 二 安装FileZilla Server 当前下载版本是0.9.43&#xf…

【刷题21】BFS解决FloodFill算法专题

目录 一、图像渲染二、岛屿数量三、岛屿的最大面积四、被环绕的区域 一、图像渲染 题目&#xff1a; 思路&#xff1a; 如果起始位置的颜色(数值)与color相同&#xff0c;直接返回该数组上下左右一层一层的找与当前位置颜色相同的&#xff0c;并且该位置不越界&#xff0c;然…

DICOM核心概念:显式 VR(Explicit VR)与隐式 VR(Implicit VR)在DICOM中的定义与区别

在DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;标准中&#xff0c;VR&#xff08;Value Representation&#xff09; 表示数据元素的值的类型和格式。理解显式 VR&#xff08;Explicit VR&#xff09;与隐式 VR&#xff08;Implicit VR&#…

【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding

Isaac Sim对电脑配置要求很高&#xff0c;开机第一次打开 Isaac Sim 时&#xff0c;直接就报 Isaac Sim is not responding 卡死了&#xff0c;这是由于第一次需要加载一些资源&#xff0c;耗时会导致 Isaac Sim 无响应&#xff0c;这里等一会会自动给回复。 加载自带模型或示…

如何读论文【论文精读·1】

第一遍题目 摘要 结论 方法 实验 是不是适合自己看看自己适不适合这篇文章。&#xff08;花时最少&#xff0c;做海选&#xff09; 不需要懂太具体的公式。这一遍阅读之后&#xff0c;你需要再继续思考一下这篇论文的质量以及和自己研究方向的契合程度&#xff0c;决定一下自己…

SpringBoot整合SpringSecurity实现一个简单的认证与授权应用

1、SpringSecurity 的简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它是 Spring 项目组中用来提供安全认证服务的框架&#xff0c;能够为基于 Sprin g的企业应用系统提供声明式的安全访问控制解决方案。 Spring Security 的前身是 A…