RWKV系列2-ChatRWKV

news2024/11/23 16:41:07

注意使用最新的版本

在这里插入图片描述

提示词

##### 步骤4.1英文对话指令
    say something --> chat with bot. use \\n for new line.
    + --> alternate chat reply
    +reset --> reset chat
    
    +gen YOUR PROMPT --> free single-round generation with any prompt. use \\n for new line.
    +i YOUR INSTRUCT --> free single-round generation with any instruct. use \\n for new line.
    +++ --> continue last free generation (only for +gen / +i)
    ++ --> retry last free generation (only for +gen / +i)

##### 步骤4.1中文对话指令
    直接输入内容 --> 和机器人聊天(建议问机器人问题),用\\n代表换行,必须用 Raven 模型
    + --> 让机器人换个回答
    +reset --> 重置对话,请经常使用 +reset 重置机器人记忆
    
    +i 某某指令 --> 问独立的问题(忽略聊天上下文),用\\n代表换行,必须用 Raven 模型
    +gen 某某内容 --> 续写内容(忽略聊天上下文),用\\n代表换行,写小说用 testNovel 模型
    +++ --> 继续 +gen / +i 的回答
    ++ --> 换个 +gen / +i 的回答
    
    作者:彭博 请关注我的知乎: https://zhuanlan.zhihu.com/p/603840957
    如果喜欢,请看我们的优质护眼灯: https://withablink.taobao.com
    
    中文 Novel 模型,可以试这些续写例子(不适合 Raven 模型):
    +gen “区区
    +gen 以下是不朽的科幻史诗长篇巨著,描写细腻,刻画了数百位个性鲜明的英雄和宏大的星际文明战争。\\n第一章
    +gen 这是一个修真世界,详细世界设定如下:\\n1.

运行环境适配参考

安装包解释:https://pypi.org/project/rwkv/

运行环境适配选择,Strategy参数配置

# set these before import RWKV
os.environ['RWKV_JIT_ON'] = '1'
os.environ["RWKV_CUDA_ON"] = '0' # '1' to compile CUDA kernel (10x faster), requires c++ compiler & cuda libraries

########################################################################################################
#
# Use '/' in model path, instead of '\'. Use ctx4096 models if you need long ctx.
#
# fp16 = good for GPU (!!! DOES NOT support CPU !!!)
# fp32 = good for CPU
# bf16 = worse accuracy, supports CPU
# xxxi8 (example: fp16i8, fp32i8) = xxx with int8 quantization to save 50% VRAM/RAM, slower, slightly less accuracy
#
# We consider [ln_out+head] to be an extra layer, so L12-D768 (169M) has "13" layers, L24-D2048 (1.5B) has "25" layers, etc.
# Strategy Examples: (device = cpu/cuda/cuda:0/cuda:1/...)
# 'cpu fp32' = all layers cpu fp32
# 'cuda fp16' = all layers cuda fp16
# 'cuda fp16i8' = all layers cuda fp16 with int8 quantization
# 'cuda fp16i8 *10 -> cpu fp32' = first 10 layers cuda fp16i8, then cpu fp32 (increase 10 for better speed)
# 'cuda:0 fp16 *10 -> cuda:1 fp16 *8 -> cpu fp32' = first 10 layers cuda:0 fp16, then 8 layers cuda:1 fp16, then cpu fp32
#
# Basic Strategy Guide: (fp16i8 works for any GPU)
# 100% VRAM = 'cuda fp16'                   # all layers cuda fp16
#  98% VRAM = 'cuda fp16i8 *1 -> cuda fp16' # first 1 layer  cuda fp16i8, then cuda fp16
#  96% VRAM = 'cuda fp16i8 *2 -> cuda fp16' # first 2 layers cuda fp16i8, then cuda fp16
#  94% VRAM = 'cuda fp16i8 *3 -> cuda fp16' # first 3 layers cuda fp16i8, then cuda fp16
#  ...
#  50% VRAM = 'cuda fp16i8'                 # all layers cuda fp16i8
#  48% VRAM = 'cuda fp16i8 -> cpu fp32 *1'  # most layers cuda fp16i8, last 1 layer  cpu fp32
#  46% VRAM = 'cuda fp16i8 -> cpu fp32 *2'  # most layers cuda fp16i8, last 2 layers cpu fp32
#  44% VRAM = 'cuda fp16i8 -> cpu fp32 *3'  # most layers cuda fp16i8, last 3 layers cpu fp32
#  ...
#   0% VRAM = 'cpu fp32'                    # all layers cpu fp32
#
# Use '+' for STREAM mode, which can save VRAM too, and it is sometimes faster
# 'cuda fp16i8 *10+' = first 10 layers cuda fp16i8, then fp16i8 stream the rest to it (increase 10 for better speed)
#
# Extreme STREAM: 3G VRAM is enough to run RWKV 14B (slow. will be faster in future)
# 'cuda fp16i8 *0+ -> cpu fp32 *1' = stream all layers cuda fp16i8, last 1 layer [ln_out+head] cpu fp32
#
# ########################################################################################################

from rwkv.model import RWKV
from rwkv.utils import PIPELINE, PIPELINE_ARGS

# download models: https://huggingface.co/BlinkDL
model = RWKV(model='/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-169m/RWKV-4-Pile-169M-20220807-8023', strategy='cpu fp32')
pipeline = PIPELINE(model, "20B_tokenizer.json") # 20B_tokenizer.json is in https://github.com/BlinkDL/ChatRWKV

ctx = "\nIn a shocking finding, scientist discovered a herd of dragons living in a remote, previously unexplored valley, in Tibet. Even more surprising to the researchers was the fact that the dragons spoke perfect Chinese."
print(ctx, end='')

def my_print(s):
    print(s, end='', flush=True)

# For alpha_frequency and alpha_presence, see "Frequency and presence penalties":
# https://platform.openai.com/docs/api-reference/parameter-details

args = PIPELINE_ARGS(temperature = 1.0, top_p = 0.7, top_k = 100, # top_k = 0 then ignore
                     alpha_frequency = 0.25,
                     alpha_presence = 0.25,
                     alpha_decay=0.996, # gradually decay the penalty
                     token_ban = [0], # ban the generation of some tokens
                     token_stop = [], # stop generation whenever you see any token here
                     chunk_len = 256) # split input into chunks to save VRAM (shorter -> slower)

pipeline.generate(ctx, token_count=200, args=args, callback=my_print)
print('\n')

out, state = model.forward([187, 510, 1563, 310, 247], None)
print(out.detach().cpu().numpy())                   # get logits
out, state = model.forward([187, 510], None)
out, state = model.forward([1563], state)           # RNN has state (use deepcopy to clone states)
out, state = model.forward([310, 247], state)
print(out.detach().cpu().numpy())                   # same result as above
print('\n')

张量分离的理解

out, state = model.forward([187, 510, 1563, 310, 247], None)
print(out.detach().cpu().numpy())      解释下这里的detach()函数和cpu函数

在这个代码片段中,out 是一个 PyTorch 张量(tensor)。detach 和 cpu 是 PyTorch 张量的两个方法,作用如下:

detach() 方法用于创建一个新的 Tensor,这个新的 Tensor 不再是原始 Tensor 的一个视图,并且与计算图(Computation Graph)断开连接。使用 detach() 方法可以将张量从计算图中分离出来,使得修改这个分离的张量不会对计算图中的其他张量产生影响,也不会更新梯度。

cpu() 方法用于将 PyTorch 张量从 GPU 上移动到 CPU 上,并返回一个新的 CPU 张量。如果需要将训练模型的中间结果打印出来或进行其他 CPU 计算,就需要使用 cpu() 方法。在上面的代码中,在张量 out 上调用了 detach() 方法,然后再使用 cpu() 方法将结果转移到 CPU 上打印出来。

因此,这段代码的作用是,将输入序列 [187, 510, 1563, 310, 247] 通过模型进行前向计算,得到输出张量 out 和状态张量 state,然后将 out 张量从计算图中分离出来,并将其移动到 CPU 上作为 Numpy 数组打印出来。

numy的打印格式设置

np.set_printoptions(precision=4, suppress=True, linewidth=200)这个函数是干嘛的?

np.set_printoptions() 函数是 Numpy 库中的一个函数,用于设置 Numpy 数组在输出时的格式和打印选项。在本例中,该函数的作用是将 Numpy 数组的打印选项进行格式化。

precision 参数指定 Numpy 打印时保留的小数点位数。在本例中,指定小数点后保留的位数为4位。

suppress 参数控制是否关闭科学计数法。当 suppress 设置为 True 时, Numpy 数组将以固定的小数格式进行打印,而不是科学计数法。在本例中,设置 suppress=True 可以避免对数据进行科学计数法的转换。

linewidth 参数指定输出行的宽度。在本例中,设置为 200 可以保证一行中尽量多的显示数据,方便查看和分析。

因此,使用这个函数可以将符合一定格式的 NumPy 数组进行格式化的输出,使其更加易读易懂。

types.SimpleNamespace()

在这个代码片段中,`types` 是 Python 内置库中的一个模块,包含了一些用于动态创建、修改和查询 Python 类和对象的工具。在这里,我们使用 `types.SimpleNamespace()` 方法创建了一个简单的命名空间对象,在其中存储了不同字段的数据,具体有什么字段需要根据实际需求而定。

在这里,使用 `types.SimpleNamespace()` 方法相当于创建一个简单的、只有属性的类,这个类中包含了一个或多个参数。我们可以将这个类的实例作为参数传递给其他 Python 函数或对象,方便地进行数据传递和处理。在这个代码片段中,我们将 `args` 对象作为参数传递给了其他对象或函数,包括 `torch.nn.Module` 模块、`tokenizers` 模块等等。

例如,`args.MODEL_NAME` 存储了训练好的模型的名称和路径,`args.n_layer` 存储了模型的网络层数,`args.n_embd` 存储了模型的嵌入层维度。这些参数可以在程序中被引用,方便地控制程序的行为并进行相应的处理。

总之,`types.SimpleNamespace()` 是 Python 内置库中的一个工具,用于创建一个简单的、只有属性的类,它的主要作用是方便地传递和处理参数和数据。

types.SimpleNamespace() 创建的对象实际上是一个具有属性的特殊对象。它本质上是一个类,也就是说,它可以像类一样定义属性,这些属性可以用于存储不同类型的数据。

所以,在一个types.SimpleNamespace() 对象中,可以使用点(.)操作符来访问和设置不同属性,属性的名称即为点操作符前面的名称。这些属性可以包含数字、字符串、元组、列表、字典、函数等类型的数据。例如,可以按照以下方式定义:

import types

args = types.SimpleNamespace()
args.MODEL_NAME = '../models/rwkv-4-pile-430m/RWKV-4-Pile-430M-20220808-8066'
args.n_layer = 24
args.n_embd = 1024
args.batch_size = 16
args.dropout = 0.2
args.learning_rate = 1e-4
在上面的代码中,我们首先导入 types 模块,然后使用 types.SimpleNamespace() 方法创建了一个新的命名空间对象 args。接着,我们为这个对象添加了一些属性,如 MODEL_NAME、n_layer、n_embd、batch_size 等等,这些属性分别关联了值 '../models/rwkv-4-pile-430m/RWKV-4-Pile-430M-20220808-8066'、241024160.21e-4 等等。

这些属性的设置方式和访问方式都类似于 Python 对象的属性。例如,我们可以通过 args.MODEL_NAME 的方式访问 MODEL_NAME 属性,获取其对应的值 '../models/rwkv-4-pile-430m/RWKV-4-Pile-430M-20220808-8066',也可以通过 args.batch_size 获取 batch_size 属性的值。这些属性值存储在对象的内部,在程序运行期间保持不变,可以在程序中被引用和使用。

为何要用这种方式?

types.SimpleNamespace() 方式通常用于将程序中的一些常用参数和值组织在一起,并方便地将它们传递给其他的 Python 函数或对象。这种方式与其他语言中的Struct或Record等结构非常类似。

使用 types.SimpleNamespace() 的一个主要好处是在一个对象中存储多个参数和值,从而方便进行相应的处理。这些参数可以在程序的多个部分中被引用和使用,而不必通过变量、字典、元组等复杂的数据结构来管理。这种方式也使得程序的可读性和可维护性得到了提高。

此外,通过使用 types.SimpleNamespace() 对象,可以轻松地扩展和更新程序的参数和配置信息。例如,要更改某个参数的值,只需要简单地修改该对象的属性即可,而不必在程序的多个部分中查找和修改相应的变量或字典键值,从而大大提高了程序的开发效率。

总的来说,types.SimpleNamespace() 对象为程序提供了一种简单而有效的方式来管理和组织参数和值,从而在代码编写和维护方面提供了很大的便利性。

sys.argv[1]参数的意思

try:
    os.environ["CUDA_VISIBLE_DEVICES"] = sys.argv[1]
except:
    pass
这个什么意思?

这段代码片段的含义是,在程序运行时,尝试读取并设置环境变量 CUDA_VISIBLE_DEVICES 的值。如果 sys.argv[1] 存在,则将 CUDA_VISIBLE_DEVICES 的值设为 sys.argv[1];否则,不进行任何操作。其中,sys.argv[1] 表示程序运行时的第二个参数,也就是从命令行传入的第一个参数。

具体来说,这段代码使用 os.environ 对象来读取和设置环境变量,首先通过 try 捕获异常的方式来尝试获取 sys.argv[1] 的值。如果 sys.argv[1] 存在(也就是以命令行参数的形式传入了一个参数),则将 CUDA_VISIBLE_DEVICES 的值设置为 sys.argv[1] 所对应的值。如果不存在该参数或者在设置 CUDA_VISIBLE_DEVICES 的过程中发生异常,则使用 pass 语句跳过该代码块,不进行任何操作。

环境变量 CUDA_VISIBLE_DEVICES 是一个影响 TensorFlow、PyTorch 等深度学习框架在 GPU 上运行的重要环境变量。它的值可以为一个或多个 GPU 设备编号,并且以逗号分隔。例如,对于有两张 GPU 设备的系统,可以将 CUDA_VISIBLE_DEVICES 的值设为 '0,1' 来启用两张 GPU 设备来运行模型。这种方式可以控制模型在哪些 GPU 设备上运行,并避免程序占用系统所有的 GPU 资源。

总之,上述代码片段的作用是在程序运行时,以命令行参数的形式读取和设置环境变量 CUDA_VISIBLE_DEVICES 的值,并控制程序在特定的 GPU 设备上运行。

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

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

相关文章

DRF框架中的GenericAPIView类

一、GenericAPIView类源码 class GenericAPIView(views.APIView):"""Base class for all other generic views."""# Youll need to either set these attributes,# or override get_queryset()/get_serializer_class().# If you are overriding …

Java中List的使用方法简单介绍

Java中List的使用方法简单介绍 java中的List就是一种集合对象,将所有的对象集中到一起存储。List里面可以放任意的java对象,也可以直接放值。 使用方法很简单,类似于数组。 使用List之前必须在程序头引入java.util.* import java.util.*; pub…

记一次 .NET 某游戏服务后端 内存暴涨分析

一:背景 1. 讲故事 前几天有位朋友找到我,说他们公司的后端服务内存暴涨,而且CPU的一个核也被打满,让我帮忙看下怎么回事,一般来说内存暴涨的问题都比较好解决,就让朋友抓一个 dump 丢过来,接…

Flowable边界事件-错误边界事件

错误边界事件 错误边界事件一、定义1. 图形标记2. 设置错误 选择错误3. XML标记 二、测试用例2.1 错误边界事件xml文件2.2 错误边界事件测试用例 总结 错误边界事件 一、定义 接收到错误编码触发事件 1. 图形标记 2. 设置错误 选择错误 自动审批的配置类配置javaDelegate和抛…

OpenCV安装及案例

目录 常见国内源: 一、简介 二、opencv安装 2.1在虚拟环境中安装 Original error was: No module named ‘numpy.core._multiarray_umath‘ 2.2在conda中安装 三、基本API opencv入门案例: 常见国内源: 清华大学: https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:…

opencv 图像基础处理_灰度图像

opencv 学习2_灰度图像 二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果想要表现更多的细节,就需要使用更多的颜色。例如,图 2-3 中的 lena 图像是一幅灰度图像, 它采用了更多的数值…

HarmonyOS学习路之方舟开发框架—基于ArkTS的声明式开发范式

UI开发(ArkTS声明式开发范式)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建HarmonyOS应用UI所必需的能力,主要包括: ArkTS ArkTS是UI开发语言&#xff0…

Apache Doris (二十五):Doris 数据导入(三)Broker Load-1

目录 1. 基本原理 2. Broker Load语法 进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容! 宝子们订阅、点赞、收藏不迷路!抓紧订阅专题! Apache Doris架构中除了有BE和…

华南农业大学|图像处理与分析技术综合设计|题目解答:定位数显区域并分离电表数字

设计任务 图 28 是一幅正在运行的数字电表图像(ipa28.jpg),试采用图像处理与分析 技术,设计适当的算法和程序,找出电表的数显区域,计算目标区域的长宽比 和像素面积;并提取其中面积最大的 …

免费的云数据库:探索PlanetScale,划分分支的MySQL Serverless平台

最近我发现了一个非常有趣的国外MySQL Serverless平台,它叫做PlanetScale。这个平台不仅仅是一个数据库,它能像代码一样轻松地创建开发和测试环境。你可以从主库中拉出一个与之完全相同结构的development或staging数据库,并在这个环境中进行开…

使用Pycharm

本人没有单独安装python,而是直接安装了anaconda 使用Pycharm创建项目 项目取名为HelloWorld,环境使用前面安装的anaconda pycharm安装模块的方法: 打开Pycharm>File > Settings>Project: Python>Project Interpreter

面试题更新之-hook中setState原理

文章目录 hook是什么?hook中setState原理 hook是什么? 在React中,Hook是一种用于在函数组件中添加状态和其他React特性的函数。它们被引入到React 16.8版本中,旨在解决使用类组件编写复杂逻辑时出现的一些问题。 使用Hook&#…

Redis的哨兵机制

Redis的哨兵机制是一套独立的模式,哨兵可看作是一个独立的进程,该进程发送命令,等待Redis的响应,达到监控Redis服务的作用。 如果在规定的时间内,接收不到Redis服务器的响应,那就说明Redis出现了问题&…

通用文字识别OCR 之实现自动化办公

摘要 随着技术的发展,通用文字识别(OCR)已经成为现代办公环境中不可或缺的工具之一。OCR技术可以将印刷或手写文本转换为可编辑或可搜索的数字文本,极大地提高了办公效率并实现了自动化办公。本文将深入探讨OCR技术在实现自动化办…

Promise的理解和使用(从入门到精通)

Promise的理解和使用 1.1Promise是什么 1、抽象表达 Promise是一门新的技术(ES6规范)Promise是JS进行异步编程的新解决方案(旧方案是单纯的使用回调函数) 2、具体表达: 从语法上来说:Promise是一个构造…

C++—C++程序基础

文章目录 1 数据类型1.1 基本数据类型1.2 字面值常量1.3 左值和右值1.4 引用与指针 2 基本输入输出2.1 输出2.2 输入 3 函数3.1 内联函数3.2 函数的重载 1 数据类型 1.1 基本数据类型 在C中,除了C语言中的int,char,float,double…

小程序主包超1.5MB分包处理流程优化方案

"subPackages": [// 分包1 {"root": "src, // 根目录"pages": [{"path": "views/business/index", // 页面路径"name": "business_index","aliasPath": "/business/index",&…

2023年9月广州/重庆/长沙/深圳DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息,2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启,相关事宜通知如下: 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

浅析神经网络模型算法在手写文字识别中的重要作用

神经网络模型是什么?与OCR有何不同? 神经网络模型是一种机器学习算法,用于对数据进行模式识别和预测,可应用于各种任务包括图像识别、自然语言处理等。而OCR(Optical Character Recognition)是一种特定的应…