torchrun分布式启动,所以要想在云端的环境下在本地的IDE上debug,需要设置一下,具体可以参考这里,需要传入的路径参数全部使用绝对路径。
目录
1、传入的句子
2、tokenizer 的tokenization
3、model的主要组成部分
4、过程中自己的小实验
总结
模型结构(测试只搭建了16层 model)
1、传入的句子
即prompts,实例中的如下所示
['I believe the meaning of life is', 'Simply put, the theory of relativity states that ', 'A brief message congratulating the team on the launch:\n\n Hi everyone,\n \n I just ', 'Translate English to French:\n \n sea otter => loutre de mer\n peppermint => menthe poivrée\n plush girafe => girafe peluche\n cheese =>']
2、tokenizer 的tokenization
示例如下
# 传入
'I believe the meaning of life is'
# tokenizer
[306, 4658, 278, 6593, 310, 2834, 338]
# 加入bos后
[1, 306, 4658, 278, 6593, 310, 2834, 338]
# 传入
'Simply put, the theory of relativity states that '
#
[3439, 17632, 1925, 29892, 278, 6368, 310, 14215, 537, 5922, 393, 29871]
#
[1, 3439, 17632, 1925, 29892, 278, 6368, 310, 14215, 537, 5922, 393, 29871]
每个句子都被tokenizer用向量来表示。不过发现并不是逐词对应一个编码,有的对应了两个。其实这就涉及了sentencepiece的原理,见这里。由于兴趣使然,继续探索了一下
'I believe the meaning of life is'
[306, 4658, 278, 6593, 310, 2834, 338]
'I believe, the meaning of life is '
[306, 4658, 29892, 278, 6593, 310, 2834, 338, 29871]
嗯,可以确定除了单词外,标点符号和空格也算做句子的一个部分。
'Simply' >> [3439, 17632]
'simply' >>[3763]
'Big' >>[7997]
'big' >>[4802]
不再继续探索了,详细的去查看sentencepiece原理,以及字节对编码 (BPE) (byte-pair-encoding (BPE))
3、model的主要组成部分
1、RSMNorm
一种标准化方法,详见这里
2、注意力运算
transformer decoder,应用掩码mask,主要的是采用RoPE位置编码方式,见这里
至于transformer的结构,见这里,不再详细赘述。
注意力运算方式采用GQA方式(Group Query Attention),至于相关的MHA,MQA的原理详见这里
3、FeedForward
前向传播过程
主要是有个并行相乘的过程,激活函数采用 SiLU。
4、过程中自己的小实验
关于 sentencepiece的探讨
以下面文档为例训练了一下,其中包括中文和英文
一、一些注意事项
1.opencv默认读取的格式是BGR,也就是三通道的顺序。
2.而用matplotlib画的图是RGB的,所以其跟用opencv画的图颜色不太一样。
cv2.waitKey(0)表示按键盘任意键后,显示的图片会消失。
如果cv2.waitKey(1000),则等1000ms后显示的图片自动消失。
b,g,r三通道按顺序依次来。每个通道的形状都是一样的。b,g,r依次对应通道0,1,2,所以可以对其进行按通道处理,
即只保留其中的一个通道,使其它通道为全为0。
注:图中的cv_show为一个自定义的函数。这就是对这个图像矩阵进行切片操作一样。
填充位置:上、下、左、右依次对应top_size,bottom_size,left_size,right_size
cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
加个常数,矩阵的每个位置都加10。
其最大只能表示255,所以加和后的数为除256取余。
两个同型图片或者加个同型矩阵,表示为对应位置加和。其最大只能表示
3月11日下午三点半左右
菜鸟网络青岛即墨园区附近
一辆面包车发生交通事故
车头内凹受损严重
不明液体泄漏一地
驾驶员被困车内
此时
路过的多位热心人急伸援手
维持现场秩序
并及时找来工具砸车玻璃救人
不到十分钟
被困驾驶员便被救出
视频上传网络后
引发网友热议点赞
3月12日上午
记者联系到
参与救人的隋向坤等人
了解了当时
惊险又温暖的事发经过
网传:砸玻璃救被困司机现场视频热传获赞
“我们一起把这个人救出来了,安全驾驶!”3月11日下午,网友“@TOP8小龙虾大闸蟹”发布视频,记录了其参与的一起马路救援。
网传视频时长17秒,在视频中,一辆面包车侧翻在马路上,周围洒落了很多撞击碎片和不明液体,面包车车头受损严重,凹陷进去一大块,一名白衣男子拿着一个工具,在砸前风挡玻璃。
很快,前风挡玻璃被砸开一个洞,车内的司机从驾驶室钻了出来。
从视频来看,尽管面包车已经面目全非,但是车内人员似乎受伤并不严重。
视频一经发布,立即引发广大网友的关注和热议。
“车被撞成这样,即使车里的人没事,也要第一时间救人,因为车辆有自燃的可能,一旦发生起火,后果不堪设想。”
“出门在外,一定要安全驾驶,带上平安上路,载着幸福回家。”
“为这些及时伸出援手的热心人点赞。”
记者注意到,在视频下的留言中,除了点赞和安全提醒,还有网友“曝光”了白衣男子的身份,“救人的这个人叫隋向坤”“即墨移风店七级社区后吕村的”。
月12日上午,记者辗转联系到了隋向坤,他介绍了当时的现场情况。“当时我们开车沿着北赵线行驶,当经过菜鸟网络青岛即墨园区附近时,发现路中间有一辆
面包车侧翻了。当时没想太多,我们抓紧时间停车,跑过去看看有没有人员受伤。过去后,
发现车内有个司机被困在驾驶室,他自己出不来,当时我和朋友一起,三个人抓紧想办法救人。”隋向坤说。
得到的词汇表结果如下
<unk> 0
<s> 0
</s> 0
, -2.70614
▁ -3.29977
。 -3.735
的 -3.88153
t -4.52595
_ -4.55706
1 -4.66518
了 -4.66623
一 -4.72225
size -4.79318
为 -4.93599
后 -4.93599
车 -5.10193
有 -5.10267
i -5.10269
“ -5.26253
” -5.27607
e -5.30048
其 -5.30267
上 -5.30268
cv -5.30269
R -5.3027
g -5.3027
m -5.30271
2. -5.30308
来 -5.36046
b -5.42288
视频 -5.50133
不 -5.50318
在 -5.54744
和 -5.55094
网友 -5.55265
事 -5.55266
砸 -5.55266
隋向坤 -5.55267
被困 -5.55267
a -5.55267
月 -5.55267
自 -5.55267
是 -5.55269
B -5.55269
r -5.55269
y -5.55269
l -5.5527
、 -5.55272
车内 -5.55382
通道 -5.57373
。” -5.5878
一个 -5.60327
▁“ -5.60654
中 -5.85697
出 -5.87985
人 -5.88318
这 -5.88391
时 -5.88421
2 -5.88449
被 -5.88597
即 -5.88597
3 -5.88599
大 -5.886
数 -5.886
矩阵 -5.886
没 -5.886
司机 -5.886
我们 -5.886
所以 -5.88601
现场 -5.88601
h -5.88601
w -5.88601
想 -5.88601
着 -5.88601
: -5.88602
多 -5.88602
看 -5.88602
路 -5.88602
E -5.88602
位置 -5.88602
按 -5.88602
( -5.88603
T -5.88603
点赞 -5.88616
一样 -5.88848
一起 -5.88892
op -5.97992
to -6.2533
救人 -6.35325
三 -6.35584
0 -6.36683
当时 -6.37716
加 -6.38142
图 -6.38303
片 -6.38306
) -6.38325
面包车 -6.38459
全 -6.38492
经 -6.38519
注 -6.38519
使 -6.38596
▁网传 -6.38598
也 -6.38598
发生 -6.38598
安全驾驶 -6.38598
撞 -6.38598
日下午 -6.38598
白衣男子 -6.38598
要 -6.38598
工具 -6.38598
个同型 -6.38599
果 -6.38599
除 -6.38599
传 -6.386
伸 -6.386
到 -6.386
取 -6.386
可 -6.386
失 -6.386
定 -6.386
对 -6.386
并 -6.386
留 -6.386
些 -6.386
从 -6.38601
太 -6.38601
都 -6.38601
很 -6.38601
G -6.38602
K -6.38602
O -6.38602
s -6.38602
凹 -6.38602
消 -6.38602
用 -6.38602
等 -6.38602
键 -6.38602
他 -6.38603
右 -6.38603
开 -6.38603
P -6.38604
下 -6.38604
左 -6.38604
f -6.38605
救 -7.01003
p -7.05187
o -7.36039
个 -7.36221
辆 -7.37107
起 -7.37386
样 -7.37563
内 -7.37937
当 -7.38203
5 -7.38255
间 -7.38261
. -7.38308
过 -7.38316
安 -7.38323
意 -7.38397
者 -7.38498
记 -7.385
去 -7.38528
行 -7.38529
进 -7.38529
点 -7.38531
赞 -7.38531
成 -7.3859
! -7.38595
7 -7.38595
七 -7.38595
份 -7.38595
光 -7.38595
叫 -7.38595
因 -7.38595
堪 -7.38595
店 -7.38595
把 -7.38595
曝 -7.38595
火 -7.38595
社 -7.38595
秒 -7.38595
移 -7.38595
第 -7.38595
级 -7.38595
蟹 -7.38595
设 -7.38595
身 -7.38595
还 -7.38595
醒 -7.38595
里 -7.38595
长 -7.38595
闸 -7.38595
风 -7.38595
家 -7.38597
快 -7.38597
6 -7.38599
两 -7.38599
保 -7.38599
只 -7.38599
广 -7.38599
或 -7.38599
立 -7.38599
持 -7.38599
8 -7.386
@ -7.386
M -7.386
c -7.386
义 -7.386
交 -7.386
以 -7.386
位 -7.386
余 -7.386
作 -7.386
便 -7.386
像 -7.386
关 -7.386
函 -7.386
分 -7.386
切 -7.386
区 -7.386
十 -7.386
半 -7.386
吕 -7.386
周 -7.386
回 -7.386
围 -7.386
地 -7.386
外 -7.386
它 -7.386
小 -7.386
带 -7.386
常 -7.386
平 -7.386
幸 -7.386
序 -7.386
式 -7.386
录 -7.386
急 -7.386
找 -7.386
拿 -7.386
提 -7.386
援 -7.386
操 -7.386
故 -7.386
旦 -7.386
村 -7.386
格 -7.386
此 -7.386
泄 -7.386
洒 -7.386
洞 -7.386
漏 -7.386
热 -7.386
燃 -7.386
理 -7.386
福 -7.386
秩 -7.386
维 -7.386
而 -7.386
能 -7.386
色 -7.386
获 -7.386
落 -7.386
虾 -7.386
解 -7.386
言 -7.386
认 -7.386
说 -7.386
读 -7.386
通 -7.386
钟 -7.386
钻 -7.386
项 -7.386
颜 -7.386
龙 -7.386
又 -7.386
发 -7.386
暖 -7.386
温 -7.386
险 -7.386
惊 -7.38601
默 -7.38601
乎 -7.38602
任 -7.38602
会 -7.38602
似 -7.38602
但 -7.38602
办 -7.38602
动 -7.38602
友 -7.38602
处 -7.38602
如 -7.38602
尽 -7.38602
己 -7.38602
已 -7.38602
朋 -7.38602
法 -7.38602
盘 -7.38602
目 -7.38602
管 -7.38602
载 -7.38602
门 -7.38602
非 -7.38602
面 -7.38602
A -7.38605
C -7.38605
D -7.38605
k -7.38605
介 -7.38605
停 -7.38605
况 -7.38605
击 -7.38605
则 -7.38605
北 -7.38605
名 -7.38605
块 -7.38605
形 -7.38605
情 -7.38605
沿 -7.38605
状 -7.38605
碎 -7.38605
绍 -7.38605
赵 -7.38605
跑 -7.38605
跟 -7.38605
转 -7.38605
辗 -7.38605
陷 -7.38605
驶 -7.38605
填 -7.38607
= -7.3861
I -7.3861
L -7.3861
充 -7.3861
线 -7.3861
鸟 -8.1869
马 -8.187
顺 -8.1871
青 -8.1872
附 -8.1873
近 -8.1874
议 -8.1875
衣 -8.1876
菜 -8.1877
联 -8.1878
翻 -8.1879
紧 -8.188
系 -8.1881
白 -8.1882
画 -8.1883
男 -8.1884
生 -8.1885
液 -8.1886
每 -8.1887
最 -8.1888
显 -8.1889
明 -8.189
损 -8.1891
挡 -8.1892
抓 -8.1893
手 -8.1894
心 -8.1895
引 -8.1896
布 -8.1897
工 -8.1898
岛 -8.1899
就 -8.19
室 -8.1901
子 -8.1902
头 -8.1903
型 -8.1904
园 -8.1905
同 -8.1906
及 -8.1907
参 -8.1908
前 -8.1909
具 -8.191
侧 -8.1911
体 -8.1912
伤 -8.1913
与 -8.1914
n -8.1915
d -8.1916
阵 -8.1917
重 -8.1918
置 -8.1919
络 -8.192
矩 -8.1921
次 -8.1922
机 -8.1923
所 -8.1924
应 -8.1925
墨 -8.1926
场 -8.1927
司 -8.1928
依 -8.1929
们 -8.193
严 -8.1931
隋 -8.1932
表 -8.1933
璃 -8.1934
玻 -8.1935
日 -8.1936
我 -8.1937
坤 -8.1938
困 -8.1939
员 -8.194
向 -8.1941
受 -8.1942
午 -8.1943
现 -8.1944
包 -8.1945
驾 -8.1946
示 -8.1947
道 -8.1948
v -8.1949
频 -8.195
视 -8.1951
z -8.1952
网 -8.1953
进行了一下测试
if __name__ == '__main__':
model_path = '************/model_output/Chinese.model'
s = spm.SentencePieceProcessor(model_file=model_path)
mm = s.EncodeAsPieces('测试一下,看看什么情况')
print(mm)
print('==================')
word = '测试一下,看看什么情况'
tokenizer = Tokenizer(model_path)
token=tokenizer.encode(word, bos=True, eos=False)
print(token)
print('==================')
decode_token = tokenizer.decode(token)
print(decode_token)
# 得到的输出
['▁', '测试', '一', '下', ',', '看', '看', '什么', '情', '况']
==================
[1, 4, 0, 11, 141, 3, 76, 76, 0, 317, 310]
==================
⁇ 一下,看看 ⁇ 情况
Process finished with exit code 0
不在词汇表中的token在decode时会显示??,0代表的是unseen的。这说明这个词汇表的长度还是太小了。这只是各测试,看看其中的过程。
总结
因为这只是测试,所以感觉没有什么太复杂的东西。真正的难点应该是训练的整体流程,需要克服许多困难。不过本次测试对llama也有了一定的了解,同时对大模型的一些使用的技术有了相关了解。(●ˇ∀ˇ●)
***
你看看现在哪有瓜啊,这都是大鹏的瓜,
***
model.args
ModelArgs(dim=4096, n_layers=32, n_heads=32, n_kv_heads=None, vocab_size=32000, multiple_of=256, ffn_dim_multiplier=None, norm_eps=1e-06, max_batch_size=4, max_seq_len=128)
模型结构(测试只搭建了16层 model)
Transformer(
(tok_embeddings): ParallelEmbedding()
(layers): ModuleList(
(0): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(1): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(2): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(3): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(4): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(5): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(6): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(7): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(8): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(9): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(10): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(11): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(12): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(13): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(14): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
(15): TransformerBlock(
(attention): Attention(
(wq): ColumnParallelLinear()
(wk): ColumnParallelLinear()
(wv): ColumnParallelLinear()
(wo): RowParallelLinear()
)
(feed_forward): FeedForward(
(w1): ColumnParallelLinear()
(w2): RowParallelLinear()
(w3): ColumnParallelLinear()
)
(attention_norm): RMSNorm()
(ffn_norm): RMSNorm()
)
)
(norm): RMSNorm()
(output): ColumnParallelLinear()
)