LLM 入门与实践(四) Yi 部署与分析

 本文截取自20万字的《PyTorch实用教程》(第二版),敬请关注:《Pytorch实用教程》(第二版)无论是零基础入门,还是CV、NLP、LLM项目应用,或是进阶工程化部署落地,在这里都有。相信在本书的帮助下,读者将能够轻松掌握 PyTorch 的使用,成为一名优秀的深度学习工程师。《Pytorch实用教程》(第二版)无论是零基础入门,还是CV、NLP、LLM项目应用,或是进阶工程化部署落地,在这里都有。相信在本书的帮助下,读者将能够轻松掌握 PyTorch 的使用,成为一名优秀的深度学习工程师。 - TingsongYu/PyTorch-Tutorial-2ndicon-default.png?t=N7T8https://github.com/TingsongYu/PyTorch-Tutorial-2nd

LLM 入门与实践(一)Qwen部署与分析

LLM 入门与实践(二)ChatGLM3 部署与分析

LLM 入门与实践(三)Baichuan2 部署与分析

前言

Yi是由零一万物开源的大语言模型,目前(2024年4月16日)包括6B和34B-chat版本,base版本有6B、9B和34B。

零一万物是2023年7月,李开复筹组新公司,部注册于北京,集中在大模型技术、人工智能算法、自然语言处理、系统架构、算力架构、数据安全、产品研发等领域。

更多信息:

  • 公司官网:零一万物-AI2.0大模型技术和应用的全球公司

  • HF: https://huggingface.co/01-ai

  • github: 01.AI · GitHub

  • LLM-github:GitHub - 01-ai/Yi: A series of large language models trained from scratch by developers @01-ai

  • 技术报告:https://arxiv.org/abs/2403.04652

部署安装

第一步,代码下载

git clone https://github.com/01-ai/Yi.git

第二步,权重下载

git clone https://www.modelscope.cn/01ai/Yi-6B-Chat-4bits.git

第三步,量化环境安装

int4和int8分别需要AWQ和GPTQ环境

pip install autoawq
​
https://github.com/casper-hansen/AutoAWQ?tab=readme-ov-file#install-from-pypi
https://github.com/AutoGPTQ/AutoGPTQ?tab=readme-ov-file#quick-installation

第四步,配置代码中模型路径

parser.add_argument(
    "-c",
    "--checkpoint-path",
    type=str,
    default=r"G:\04-model-weights\Yi-6B-Chat-4bits",
    help="Checkpoint name or path, default to %(default)r",
)        default=r"G:\04-model-weights\Yi-6B-Chat-4bits",
​

第五步,运行代码

Yi没有提供命令行的交互demo,提供的事web ui版,运行Yi\demo\web_demo.py 即可跳出基于gradio的交互界面。

修改后的代码可参考github

模型UML分析

Yi的github仓库及模型权重仓库均未找到类似Qwen、ChatGLM、Baichuan那样的模型文件,因此无法深入探究模型结构。

为了探究Yi模型的推理步骤,debug观察到以下信息,供流程分析所用。

  1. model = AutoModelForCausalLM.from_pretrained 获得的模型是LlamaForCausalLM类,其中的核心model是LlamaModel

LlamaForCausalLM(
  (model): LlamaModel(
    (embed_tokens): Embedding(64000, 4096)
    (layers): ModuleList(
      (0-31): 32 x LlamaDecoderLayer(
        (self_attn): LlamaSdpaAttention(
          (q_proj): WQLinear_GEMM(in_features=4096, out_features=4096, bias=False, w_bit=4, group_size=128)
          (k_proj): WQLinear_GEMM(in_features=4096, out_features=512, bias=False, w_bit=4, group_size=128)
          (v_proj): WQLinear_GEMM(in_features=4096, out_features=512, bias=False, w_bit=4, group_size=128)
          (o_proj): WQLinear_GEMM(in_features=4096, out_features=4096, bias=False, w_bit=4, group_size=128)
          (rotary_emb): LlamaRotaryEmbedding()
        )
        (mlp): LlamaMLP(
          (gate_proj): WQLinear_GEMM(in_features=4096, out_features=11008, bias=False, w_bit=4, group_size=128)
          (up_proj): WQLinear_GEMM(in_features=4096, out_features=11008, bias=False, w_bit=4, group_size=128)
          (down_proj): WQLinear_GEMM(in_features=11008, out_features=4096, bias=False, w_bit=4, group_size=128)
          (act_fn): SiLU()
        )
        (input_layernorm): LlamaRMSNorm()
        (post_attention_layernorm): LlamaRMSNorm()
      )
    )
    (norm): LlamaRMSNorm()
  )
  (lm_head): Linear(in_features=4096, out_features=64000, bias=False)
)
  1. 在模型权重的config.json中,体现模型架构为LlamaForCausalLM

{
  "architectures": [
    "LlamaForCausalLM"
  ],
  "attention_bias": false,
  "bos_token_id": 1,
  "eos_token_id": 2,
  "hidden_act": "silu",
  "hidden_size": 4096,
  "initializer_range": 0.02,
  "intermediate_size": 11008,
  "max_position_embeddings": 4096,
  "model_type": "llama",
  "num_attention_heads": 32,
  "num_hidden_layers": 32,
  "num_key_value_heads": 4,
  "pretraining_tp": 1,
  "quantization_config": {
    "bits": 4,
    "group_size": 128,
    "quant_method": "awq",
    "version": "gemm",
    "zero_point": true
  },
  "rms_norm_eps": 1e-05,
  "rope_scaling": null,
  "rope_theta": 5000000.0,
  "tie_word_embeddings": false,
  "torch_dtype": "float16",
  "transformers_version": "4.35.0",
  "use_cache": true,
  "vocab_size": 64000
}
​

Prompt 结构分析

web_demo.py代码结构整体基于transformers库的工具来实现,推理采用流处理,基于transformers的TextIteratorStreamer实现,模型单次推理由TextIteratorStreamer代理,这里不深入。

这里看看Yi源代码中的predict函数,该函数对历史对话进行了处理,实现多轮对话的Prompt处理。大体可分为4步:

第一步:将历史信息转为模型输入的tokens_ids, 这一步调用transformers的apply_chat_template接口功能实现;

第二步:创建流处理器TextIteratorStreamer

第三步:组装本轮对话所需信息,generate_kwargs

第四步:启动线程执行model.generate, 从流处理器streamer中拿单次推理的结果

由于大部分是transformers库的代码,此处就不深入展开了

def predict(history, max_length, top_p, temperature):
    stop = StopOnTokens()
    messages = []
    for idx, (user_msg, model_msg) in enumerate(history):
        if idx == len(history) - 1 and not model_msg:
            messages.append({"role": "user", "content": user_msg})
            break
        if user_msg:
            messages.append({"role": "user", "content": user_msg})
        if model_msg:
            messages.append({"role": "assistant", "content": model_msg})
​
    print("\n\n====conversation====\n", messages)
    model_inputs = tokenizer.apply_chat_template(
        messages, add_generation_prompt=True, tokenize=True, return_tensors="pt"
    ).to(next(model.parameters()).device)
    streamer = TextIteratorStreamer(
        tokenizer, timeout=60, skip_prompt=True, skip_special_tokens=True
    )
    generate_kwargs = {
        "input_ids": model_inputs,
        "streamer": streamer,
        "max_new_tokens": max_length,
        "do_sample": True,
        "top_p": top_p,
        "temperature": temperature,
        "stopping_criteria": StoppingCriteriaList([stop]),
        "repetition_penalty": 1.2,
    }
    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()
​
    for new_token in streamer:
        if new_token != "":
            history[-1][1] += new_token
            yield history

小结

通过Yi的代码,可以了解如何快速基于transformers构建一个LLM推理部署代码。

并且可以了解GPTQ和AWQ的部署需要单独安装对应的python库。

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

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

相关文章

【C++】stack和queue的模拟实现 双端队列deque的介绍

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🔥stack的模拟实现🔥queue的模拟实现🔥deque(双端队列)deque的缺陷 🌈为什么选择…

免费分享:1981-2016全球粮食产量数据集(附下载方法)

了解主要作物的历史产量模式,包括趋势和年际变化,对于了解在粮食需求和气候变化日益增长的情况下粮食生产的现状、潜力和风险至关重要。 数据简介 1981-2016全球粮食产量数据集是农业普查统计(粮农组织报告的国家产量统计数据)和…

Python3极简教程(一小时学完)中

异常 在这个实验我们学习 Python 的异常以及如何在你的代码中处理它们。 知识点 NameErrorTypeError异常处理(try..except)异常抛出(raise)finally 子句 异常 在程序执行过程中发生的任何错误都是异常。每个异常显示一些相关…

多国广播无线电台RadioMaximus Pro 2.33.00

RadioMaximus Pro是一款适用于Windows的程序,可让您收听和录制互联网上数以千计的广播电台。使用RadioMaximus Pro,您可以享受来自世界各地的最多样化的收音机。 RadioMaximus Pro是一款具有录音功能的全功能收音机播放器,您可以同时收听和录制多个电台,创建自动录音时间表…

搞不清啊?伦敦金与上海金区别是?

进入黄金市场的朋友,有可能会被各式各样的黄金交易品种带得眼花缭乱,其实各品种虽然都以黄金作为投资标的物,但是也是各有不同的,下面我们就来比较一下相似的投资品种——伦敦金和上海金。 首先在比较之前,我们要搞清楚…

js逆向研究【响应结果解密思路与案例实战】

什么是响应结果加密 我们在爬虫过程中,抓包之后,针对内容关键词搜索无法定位到数据接口,并在响应的接口内发现有编码/不可读的长字符串等,我们可以判定其为响应结果加密。 如何针对将响应结果还原为可读的数据 如果响应结果有特…

Android平台实现RTSP拉流转发至轻量级RTSP服务

技术背景 我们在做Android平台RTSP转发模块的时候,有公司提出来这样的技术需求,他们希望拉取外部RTSP摄像头的流,然后提供个轻量级RTSP服务,让内网其他终端过来拉流。实际上,这块,大牛直播SDK前几年就已经…

python网络编程-TCP/IP

链路层 帧组成(按顺序): 目标MAC:6B 源MAC:6B 类型:2B 数据:46B-1500B CRC:4B 其中,源MAC为主机网卡地址,类型为来源网络层的数据类型,ipv…

基于Java+SpringMvc+Vue技术智慧校园系统设计与实现--60页及以上论文参考

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

Python 爬虫 tiktok API接口获取tiktok用户关注列表

此接口可获取tiktok用户关注列表。若有需要,请点击文末链接联系我们。 详细采集页面如下https://www.tiktok.com/quanap_official 请求API http://api.xxxx.com/tt/user/following?user_id7252644648840381445&count10&offset0&tokentest 请求参数 返…

雅虎财经世媒讯全球软文发稿对于企业宣发的意义

在当今信息爆炸的时代,企业宣传和品牌推广的方式变得多种多样,其中软文发稿成为了一种颇受欢迎的宣传手段。雅虎作为全球知名的门户网站之一,拥有广泛的用户基础和强大的影响力,通过雅虎进行软文发稿,不仅可以有效提升…

移远BC28_opencpu方案_开发环境搭建

OPEN CPU 代码采用的是 Python 脚本写的 scons 自动化构建工具。从构建这个角度说,它与 GNU make 是同一类的工具。它是一种改进,并跨平台的 gnu make 替代工具,其集成功能类似于 autoconf/automake。 这里给出简单安装方式

WAIC | 2024年世界人工智能大会“数学与人工智能”学术会议成功举办!

由斯梅尔数学与计算研究院(Smale Institue of Mathematics & Computation)主办的2024年世界人工智能大会(WAIC)“数学与人工智能”学术会议7月4日在上海世博中心圆满落幕!作为全球性高级别学术研讨会,此次会议由华院计算技术&…

如何通过ip地址判断网络类别

在计算机网络中,IP地址不仅是设备在网络中的唯一标识,同时也隐含了网络类别的信息。了解如何根据IP地址判断网络类别,对于网络管理员、系统工程师以及网络爱好者来说都是一项基本技能。本文将详细介绍如何通过IP地址判断网络类别。 一、IP地址…

伦敦银交易平台价格的突破成不成功?这点很重要!

在伦敦银交易中,当银价出现突破的时候,也正是引起很多投资者关注的时候。一旦银价出现突破,很可能是新行情的开端。但是做过突破交易,有相关经验的朋友会发现,自己在伦敦银交易平台做突破的时候,也并不是每…

等保2.0中,云计算平台如何做到数据的分类和加密?

在信息化浪潮的激荡中,云计算平台已然成为企业智慧运作的心脏,承载着海量的数据资产。随着中国国家网络安全等级保护制度迈入2.0时代,对云计算平台的数据安全提出了更为严苛的要求。在这一背景下,如何巧妙地编织数据的分类之网&am…

MySQL的慢sql

什么是慢sql 每执行一次sql,数据库除了会返回执行结果以外,还会返回sql执行耗时,以mysql数据库为例,当我们开启了慢sql监控开关后,默认配置下,当sql的执行时间大于10s,会被记录到慢sql的日志文件…

【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech

Fish Speech是一款由fishaudio开发的全新文本转语音工具,支持中英日三种语言,语音处理接近人类水平,使用Flash-Attn算法处理大规模数据,提供高效、准确、稳定的TTS体验。 Fish Audio

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f60…

Avalonia 常用控件四 Text Controls

1、AutoCompleteBox <StackPanel Margin"20"><TextBlock Margin"0 5">选择一种动物</TextBlock><AutoCompleteBox x:Name"animals" FilterMode"StartsWith"/><!--AutoCompleteBox:Items:要匹配的项目列表。…