llama2 代码实验记录

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()
)

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BJTU深度学习实验4是指北京交通大学开设的一门深度学习实验课程中的第四个实验内容。 在这个实验中,学生将学习和应用深度学习算法,探索不同网络结构和优化方法对模型性能的影响。 首先,学生将使用Python编程语言和深度学习库(如TensorFlow或PyTorch)来构建卷积神经网络(CNN)模型。通过调整网络层数、卷积核大小、池化层配置等参数,学生可以探索不同网络结构对于图像分类等任务的影响。 其次,学生还将尝试不同的优化方法来提高模型的性能。常见的优化方法包括梯度下降、随机梯度下降、Adam等。通过使用不同的优化方法,学生可以比较它们在模型训练过程中的表现,选择最佳的优化方法。 在实验过程中,学生将使用已经标注好的数据集进行训练和测试。他们需要了解数据集的特点,以及数据预处理的方法,如图像尺寸调整、数据增强等。这些步骤对于模型的性能和泛化能力至关重要。 最后,学生需要进行实验结果的分析和总结。他们将评估不同网络结构和优化方法的性能,比较它们的准确率、损失值等指标。通过对实验结果的分析,他们可以得出结论,为后续实验和研究提供指导。 总之,BJTU深度学习实验4是一门帮助学生熟悉深度学习算法,并进行实践和探索的课程实验。通过这个实验,学生可以了解到深度学习模型的构建和优化方法,以及数据处理和实验结果分析的重要性。这对于他们深入学习和应用深度学习有着重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匿名的魔术师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值