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

因为我们实验室的服务器不能联网,所以只能部署到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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法(1)

目录 柠檬水找零 题解: 代码: 将数组和减半的最少操作次数(大根堆) 题解: 代码: 最大数(注意 sort 中 cmp 的写法) 题解: 代码: 摆动序列&#xff0…

网络爬虫——综合实战项目:多平台房源信息采集与分析系统

1. 项目背景与目标 1.1 项目背景 随着房产市场的快速发展,各大平台上充斥着大量房源信息。为了帮助用户快速掌握市场动态,需要通过爬虫技术自动采集多平台数据,清洗后进行存储和分析,为用户提供有价值的洞察。开发者通过这一实战…

数据结构-7.Java. 对象的比较

本篇博客给大家带来的是java对象的比较的知识点, 其中包括 用户自定义类型比较, PriorityQueue的比较方式, 三种比较方法...... 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 .…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备如何使用Docker运行?

在当今的安防监控领域,随着视频监控技术的不断发展和应用范围的扩大,如何高效、稳定地管理并分发视频流资源成为了行业内外关注的焦点。EasyNVR作为一款功能强大的多品牌NVR管理工具/设备,凭借其灵活的部署方式和卓越的性能,正在引…

LSTM原理解读与实战

在RNN详解及其实战中,简单讨论了为什么需要RNN这类模型、RNN的具体思路、RNN的简单实现等问题。同时,在文章结尾部分我们提到了RNN存在的梯度消失问题,及之后的一个解决方案:LSTM。因此,本篇文章主要结构如下&#xff…

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介 登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~ 淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题): 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…

使用Element UI实现前端分页,前端搜索,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、前端搜索1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 三、跨页选择1、模板部分 (\<template>)2、…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

探索PyMuPDF:Python中的强大PDF处理库

文章目录 **探索PyMuPDF&#xff1a;Python中的强大PDF处理库**第一部分&#xff1a;背景第二部分&#xff1a;PyMuPDF是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;至少5个简单的库函数使用方法第五部分&#xff1a;结合至少3个场景…

go语言range的高级用法-使用range来接收通道里面的数据

在 Go 语言中&#xff0c;可以使用 for ... range 循环来遍历通道&#xff08;channel&#xff09;。for ... range 循环会一直从通道中接收值&#xff0c;直到通道关闭并且所有值都被接收完毕。 使用 for ... range 遍历通道 示例代码 下面是一个使用 for ... range 遍历通…

14.C++STL1(STL简介)

⭐本篇重点&#xff1a;STL简介 ⭐本篇代码&#xff1a;c学习/7.STL简介/07.STL简介 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. STL六大组件简介 二. STL常见算法的简易使用 2.1 swap ​2.2 sort 2.3 binary_search lower_bound up_bound 三…

5G CPE与4G CPE的主要区别有哪些

什么是CPE&#xff1f; CPE是Customer Premise Equipment&#xff08;客户前置设备&#xff09;的缩写&#xff0c;也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备&#xff0c;用于连接用户…

智能安全配电装置在高校实验室中的应用

​ 摘要&#xff1a;高校实验室是科研人员进行科学研究和实验的场所&#xff0c;通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例&#xff0c;对事故原因、危害程度以及防范措施进行分析和总结…

深入理解 LMS 算法:自适应滤波与回声消除

深入理解 LMS 算法&#xff1a;自适应滤波与回声消除 在信号处理领域&#xff0c;自适应滤波是一种重要的技术&#xff0c;广泛应用于噪声消除、回声消除和信号恢复等任务。LMS&#xff08;Least Mean Squares&#xff09;算法是实现自适应滤波的经典方法之一。本文将详细介绍…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 &#xff08;一&#xff09;分布式锁&#xff1a;应对分布式环境的同步挑战 &#xff08;二&#xff09;分布式锁的实现方式 &#xff08;三&#xff09;分布式锁的使用场景 &#xff08;四&#xff09;分布式锁需满足的特点 二、Redis 实现分…

socket连接封装

效果&#xff1a; class websocketMessage {constructor(params) {this.params params; // 传入的参数this.socket null;this.lockReconnect false; // 重连的锁this.socketTimer null; // 心跳this.lockTimer null; // 重连this.timeout 3000; // 发送消息this.callbac…

基于RM开发板32学习日记

环境配置 芯片选型 STM32F407IGH6 配置时钟 12 168 模块 Led 引脚选择 比对原理图 可查看 设置为Out_Put输出 三色同时点亮 合为白色光 HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);GPIOH->ODR…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…

刷题笔记15

问题描述 小M和小F在玩飞行棋。游戏结束后&#xff0c;他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子&#xff0c;每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组&#xff0c;每组恰好5个&#xff0c;并且组内棋子的序号相同。小M希望知道是否可以按照这…

stm32 指定变量存储地址

uint8_t array[10] attribute((at(0x20000000))) 当你使用 attribute((at(地址))) 强制将变量放置在特定地址时&#xff0c;编译器和链接器通常不会自动调整其他变量的地址以避免冲突。这意味着&#xff0c;如果指定的地址已经被其他变量占用&#xff0c;就会发生冲突。 如果…