DeepSeek-R1:模型部署与应用实践

深入探索DeepSeek-R1:模型部署与应用实践

在当今人工智能飞速发展的时代,大语言模型(LLMs)已经成为众多领域的核心驱动力。DeepSeek-R1作为一款备受瞩目的模型,在自然语言处理任务中展现出了强大的能力。本文将深入探讨DeepSeek-R1的部署过程、代码实现细节以及应用中的一些关键要点。

在这里插入图片描述

一、DeepSeek-R1模型简介

DeepSeek-R1是一个基于Transformer架构的因果语言模型,它在预训练阶段学习了大量的文本数据,从而具备了理解和生成自然语言的能力。与其他模型相比,DeepSeek-R1在处理长文本、语义理解和生成质量上具有独特的优势,尤其适用于对话系统、文本生成等任务。

二、模型部署与代码实现

(一)环境准备

在部署DeepSeek-R1之前,可以使用AutoDL服务器环境满足以下要求:

  1. 硬件:具备NVIDIA GPU,以加速模型推理。
  2. 软件:安装PyTorch、transformers库等依赖包。
    在这里插入图片描述

(二)代码解析

  1. 导入必要的库
import os
import json
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import unicodedata
from typing import List

这些库提供了文件操作、数据处理、模型加载和推理等功能。

  1. 生成函数
@torch.inference_mode()
def generate(model: AutoModelForCausalLM,input_ids: torch.Tensor,attention_mask: torch.Tensor,max_new_tokens: int,temperature: float = 1.0
) -> List[int]:outputs = model.generate(input_ids=input_ids,attention_mask=attention_mask,max_new_tokens=max_new_tokens,temperature=temperature,eos_token_id=model.config.eos_token_id,pad_token_id=model.config.eos_token_id,do_sample=True,top_k=50,top_p=0.95,)return outputs[0].tolist()

generate函数负责根据输入的文本生成回复。通过设置attention_mask,可以确保模型在处理文本时关注到正确的位置。temperaturetop_ktop_p等参数用于控制生成文本的随机性和多样性。

  1. 输入清理函数
def clean_input(user_input):user_input = "".join(c for c in user_input if not unicodedata.category(c).startswith("C"))return user_input.strip()

clean_input函数用于清理用户输入,去除不可见字符和多余的空格,确保输入的文本质量。

  1. 消息内容清理函数
def clean_message_content(content):if not content or not isinstance(content, str):return ""return content.strip()

该函数用于清理消息内容,过滤掉无效输入。

  1. 构建提示函数
def build_prompt(messages, max_history=3):template = "The following is a conversation with an AI assistant. The assistant is helpful, knowledgeable, and polite:\n"for msg in messages[-max_history:]:content = clean_message_content(msg["content"])if not content:continuetemplate += f"{msg['role'].capitalize()}: {content}\n"template += "Assistant: "return template.strip()

build_prompt函数用于构建模型输入的提示,通过限制对话历史的长度,可以减少计算量并提高模型的响应速度。

(三)模型加载与交互

if __name__ == "__main__":print("Initializing DeepSeek-R1 Service...")ckpt_path = "/root/DeepSeek-R1"config_path = "/root/DeepSeek-R1/config.json"tokenizer = AutoTokenizer.from_pretrained(ckpt_path)model = AutoModelForCausalLM.from_pretrained(ckpt_path,torch_dtype=torch.bfloat16,).cuda()messages = []while True:user_input = input("You: ").strip()user_input = clean_input(user_input)if not user_input or len(user_input.strip()) == 0:print("Invalid input. Please type something meaningful!")continueif user_input.lower() in ["exit", "quit"]:print("Exiting conversation. Goodbye!")breakmessages.append({"role": "user", "content": user_input})messages = messages[-10:]prompt = build_prompt(messages)if not isinstance(prompt, str) or len(prompt.strip()) == 0:print("Error: Prompt is empty or invalid. Skipping this turn.")continuetokenized_prompt = tokenizer(prompt, return_tensors="pt", truncation=True, padding=True)input_ids = tokenized_prompt["input_ids"].to("cuda")attention_mask = tokenized_prompt["attention_mask"].to("cuda")max_new_tokens = 150temperature = 0.7completion_tokens = generate(model, input_ids, attention_mask, max_new_tokens, temperature)completion = tokenizer.decode(completion_tokens[len(input_ids[0]):],skip_special_tokens=True).split("User:")[0].strip()print(f"Assistant: {completion}")messages.append({"role": "assistant", "content": completion})

在主程序中,首先加载模型和分词器,然后进入一个循环,等待用户输入。用户输入经过清理和处理后,构建成提示并输入模型进行推理。模型生成的回复经过解码后显示给用户,并添加到对话历史中。

在这里插入图片描述

0:"Qwen2ForCausalLM"
attention_dropout:0
bos_token_id:151643
eos_token_id:151643
hidden_act:"silu"
hidden_size:1536
initializer_range:0.02
intermediate_size:8960
max_position_embeddings:131072
max_window_layers:21
model_type:"qwen2"
num_attention_heads:12
num_hidden_layers:28
num_key_value_heads:2
rms_norm_eps:0.000001
rope_theta:10000
sliding_window:4096
tie_word_embeddings:false
torch_dtype:"bfloat16"
transformers_version:"4.44.0"
use_cache:true
use_mrope:false
use_sliding_window:false
vocab_size:151936
_from_model_config:true
bos_token_id:151646
eos_token_id:151643
do_sample:true
temperature:0.6
top_p:0.95
transformers_version:"4.39.3"
add_bos_token:true
add_eos_token:false
clean_up_tokenization_spaces:false
legacy:true
model_max_length:16384
sp_model_kwargs:
unk_token:null
tokenizer_class:"LlamaTokenizerFast"
chat_template:"{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '</think>' in content %}{% set content = content.split('</think>')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|>'}}{% endif %}"

在这里插入图片描述

在这里插入图片描述

四、总结与展望

通过以上步骤,成功部署了DeepSeek-R1模型,并实现了一个简单的对话系统。在实际应用中,还可以进一步优化模型的性能,例如调整超参数、使用更高效的硬件等。同时,结合更多的领域知识和数据,可以让DeepSeek-R1在特定任务中发挥更大的作用。未来,随着大语言模型技术的不断发展,DeepSeek-R1有望在更多领域得到广泛应用,为自然语言处理带来更多的创新和突破。

附录:
https://www.codewithgpu.com/i/deepseek-ai/DeepSeek-R1/DeepSeek-R1/1624/4

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 大视界 -- 基于 Java 的大数据机器学习模型压缩与部署优化(99)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

socket编程详解

TCP报文格式 0. 举例 首先来看一个TCP连接的例子&#xff0c;如图1所示&#xff0c;分别给出了服务器和客户端所调用的API&#xff0c;对这些函数有一个总体认识之后&#xff0c;再逐个对每个函数详细介绍。 图1 创建TCP连接时服务器、客户端调用的API 1. socket() 注&#xf…

企业知识库搭建:14款开源与免费系统选择

本文介绍了以下14 款知识库管理系统&#xff1a;1.Worktile&#xff1b;2.PingCode&#xff1b;3.石墨文档&#xff1b; 4. 语雀&#xff1b; 5. 有道云笔记&#xff1b; 6. Bitrix24&#xff1b; 7. Logseq等。 在如今的数字化时代&#xff0c;企业和团队面临着越来越多的信息…

Spring Cloud Alibaba学习 3- Sentinel入门使用

Spring Cloud Alibaba学习 3- Sentinel入门使用 中文文档参考&#xff1a;Sentinel中文文档 一. SpringCloud整合Sentinel 1.1 下载Sentinel-Dashboard Sentinel下载地址&#xff1a;Sentinel-Dashboard 到下载目录&#xff0c;cmd输入 java -jar sentinel-dashboard-1.8…

STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)

定时器有四个通道&#xff0c;这些通道既可以用来作为输入&#xff0c;又可以作为输出。做输入的时候&#xff0c;可以使用定时器对外部输入的信号的时间参数进行测量&#xff1b;做输出的时候&#xff0c;可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…

Spring MVC框架六:Ajax技术

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 jQuery.ajax Ajax原理 结语 创作不易&#xff0c;希望能对大家给予帮助 想要获取更多资源? 点击链接获取

通过返回的key值匹配字典中的value值

需求 页面中上面搜索项有获取字典枚举接口&#xff0c;table表格中也有根据key匹配字典中的value 方案一 需要做到的要求 这里上面下拉列表是一个组件获取的字典&#xff0c;下面也是通过字典匹配&#xff0c;所以尽量统一封装一个函数&#xff0c;每个组件保证最少变动tabl…

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动&#xff0c;当玩家点击键盘上的左右按键时&#xff0c;汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中&#xff0c;第20行代码通过pygame.key.get_pressed()函数获…

通俗易懂:RustDesk Server的搭建及使用

最近有很多远程桌面连接的需求&#xff0c;使用花生壳、topdesk等现有的远程控制又有数量上的限制&#xff0c;因此利用公司现有的具有固定IP地址的服务器&#xff0c;搭建了一台 RustDesk Server来解决工作中的痛点。 结论是丝毫不输哪些收费的软件&#xff0c;不论是剪切板、…

SQL注入练习

目录 一、如何绕过 information schema 字段过滤注入 二、如何绕过 order by 语句过滤注入 三、seacmsv9 实现报错注入数据 一、如何绕过 information schema 字段过滤注入 1、使用其他系统表&#xff0c;不同数据库有各自的系统表&#xff0c;可替代information_schema。 …

手机放兜里,支付宝“碰一下”被盗刷?

大家好&#xff0c;我是小悟。 近期&#xff0c;网络上关于“支付宝‘碰一下’支付易被盗刷”的传言甚嚣尘上&#xff0c;不少用户对此心生疑虑。 首先&#xff0c;要明确一点&#xff1a;“碰一下”支付并不会像某些传言中所描述的那样容易被隔空盗刷。这一观点已经得到了支付…

MySQL MHA 部署全攻略:从零搭建高可用数据库架构

文章目录 1.MHA介绍2.MHA组件介绍3.集群规划4.服务器初始化5.MySQL集群部署5.1 安装MySQL集群5.2 配置一主两从5.3 测试MySQL主从5.4 赋予MHA用户连接权限 6.安装MHA环境6.1 安装MHA Node6.2 安装MHA Manager 7.配置MHA环境8.MySQL MHA高可用集群测试8.1 通过VIP连接MySQL8.2模…

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是国内视频行业最重要的国家标准&#xff0c;目前有三个版本&#xff1a; 2011 年&#xff1a;推出 GB/T 28181-2011 版本&#xff0c;为安防行业的前端设备、平…

ThinkPHP:配置Redis并使用

文章目录 一、环境说明二、php.ini中配置Redis扩展1、下载php_redis.dll文件2、安装Redis扩展3、修改php.ini4、重启wamp服务 三、thinkphp6项目中修改配置及使用 一、环境说明 我的是64位Windows10环境&#xff0c;安装了wamp环境集成工具&#xff0c;方便学习使用。 php版本…

[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)

一、介绍 昨天有提到官方已经支持了Skyreels&#xff0c;皆大欢喜&#xff0c;效果更好一些&#xff0c;还有GGUF量化版本&#xff0c;进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建&#xff0c;我体验下来感觉更稳了一些&#xff0c;生成速度也更快&#xf…

ui设计公司兰亭妙微分享:科研单位UI界面设计

科研单位的UI界面设计是一项至关重要的任务&#xff0c;它不仅关乎科研工作的效率&#xff0c;还直接影响到科研人员的用户体验。以下是对科研单位UI界面设计的详细分析&#xff1a; 一、设计目标 科研单位的UI界面设计旨在提升科研工作的效率与便捷性&#xff0c;同时确保科…

纷析云:赋能企业财务数字化转型的开源解决方案

在企业数字化转型的浪潮中&#xff0c;财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案&#xff0c;为企业提供了一条理想的转型路径。 一、开源的力量&#xff1a;自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…

Win11安装dpanel实现docker可视化面板,并解决端口冲突的问题

目标是给Win11的docker安装dpanel可视化面板&#xff0c;可以更直观的看到docker中的数据。 执行镜像&#xff08;没有则自动拉取&#xff09; 首先配置好docker加速环境&#xff08;阿里云的docker加速等&#xff09;&#xff0c;然后访问GitHub - donknap/dpanel: 轻量化 do…

Jmeter聚合报告导出log文档,Jmeter聚合报告导出到CSV

Jmeter聚合报告导出log文档 在Filename中输入 EKS_perf_log\\${type}_log\\${__P(UNIQUEID,${__time(YMDHMS)})}\all-graph-results-log.csv 可以得到执行的log&#xff0c;文件夹包含时间戳 Jmeter聚合报告导出到CSV 点击Save Table Data&#xff0c;保存到CSV文件中

OpenAPI Generator:API开发的瑞士军刀

一、工具介绍 OpenAPI Generator是基于OpenAPI规范(Swagger)的代码生成工具&#xff0c;支持50种编程语言的客户端/服务端代码生成。其核心价值在于&#xff1a; 自动化生成⇒减少重复劳动规范API开发流程 核心能力矩阵&#xff1a; 功能支持示例客户端SDK生成Java/Python/T…