首页 >> 宠物训练
宠物训练

混合精度下位置编码竟有大坑,LLaMA等主流自由软件模型纷纷中招

发布时间:2024-01-17 12:17

,可以拓展到多维的情况可得:

为了替换成远程震荡的特适度,Rope里面 heta的挑选出并不需要了Transformer 类似专著里面 sinusoidal 关系式。

AlibiAlibi是谷歌撰写在ICLR2022的一篇工作,Alibi主要解决了右边字符亦然视觉效果负的痛点,插最大值思想体系极为的简便,而且极为直观。与如此一来延在Embedding 上的绝对右边字符各不相同,Alibi的思想体系是在 Attention matrix上施延一个与东北方之比的责罚偏置,责罚偏置随着相对东北方的减小而减小。在具体情况构建时,对于每个head则会有一个超参m 来压制责罚偏置随着相对东北方减小的倾斜度(斜率)。

示意图4-Alibi attention bias示意示意图

专著最近Alibi 前所未有的提升了数学模型的亦然适度能,16k token 的输出依然可以很好的全力支持

示意图5-Alibi 亦然视觉效果对比

融合灵敏度下右边字符的bug从上头的插最大值物理现象里面,不管是RoPE 的 cos(m heta) 还是alibi 的 i-1(m, i 代表者postion id), 都无需为每个右边转化一个对数的position_id, 在实例视窗比较大的时候,秋水笔记本电脑断定目前非主流的右边字符构建在融合灵敏度下都长期存在因为偏高灵敏度(float16/bfloat16)浮点声称灵敏度缺乏导致右边字符摩擦的疑虑。众所周知当数学模型锻炼(解答)时实例阔度越来越长,偏高灵敏度声称带来的右边字符摩擦疑虑越来越不堪重负,进而影响数学模型的视觉效果,下面以bfloat16为例来指明这个 bug

浮点声称灵敏度

浮点在计算器里面声称由小写字母位(sign),指数位(exponent),尾数位(fraction) 三部分组成, 对于一个常规的最大值声称,可以由如下关系式来计算其代表者的最大值(其里面offset是指数位的偏置):由关系式可知,尾数位的阔度暂时了浮点的声称灵敏度。深度学习里面里面用的 float32/float16/bfloat16 内存里面的声称分别如下示意图所示:

示意图6-bfloat16 的声称文件格式

示意图7-float16 的声称文件格式

示意图8-float32 的声称文件格式

可以看得见可以看得见float16和bfloat16相对于float32都白白了声称的灵敏度,早先以bfloat16为例指明右边字符里面长期存在的疑虑(float16同理)。 下表简介了bfloat16在各不相同最大值范围(只省去有理数部分)内的声称灵敏度

Min

Max

Interval

1

2

2_(-7)

2

4

2_(-6)

4

8

2_(-5)

8

16

2_(-4)

16

32

2_(-3)

32

64

2_(-2)

64

128

2_(-1)

128

256

1

256

512

2

512

1024

4

1024

2048

8

2048

4096

16

4096

8192

32

8192

16384

64

16384

32768

128

可以看得见当有理数范围超过256,bfloat16就无法正确声称每一个有理数,我们可以用编码验证一下声称灵敏度带来的疑虑

RoPEMax Alibi 字符的疑虑MetaGNU的llama数学模型有别于了RoPE的右边负分,此前的构建(以及几乎的第三方llama系列数学模型)在bfloat16下长期存在灵敏度疑虑带来的右边字符摩擦(各不相同右边的token在bfloat16下变成同一个数)。llama此前编码如下:

Pythonclass LlamaRotaryEmbedding(torch.nn.Module):def _init_(self, dim, max_position_embeddings=2048, base=10000, device=None):super()._init_()self.dim = dimself.max_position_embeddings = max_position_embeddingsself.base = baseinv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim))self.register_buffer("inv_freq", inv_freq, persistent=False)# Build here to make 于大torch.jit.trace于大 work.self._set_cos_sin_cache(seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype())def _set_cos_sin_cache(self, seq_len, device, dtype):self.max_seq_len_cached = seq_lent = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype)freqs = torch.einsum("i,j->ij", t, self.inv_freq)# Different from paper, but it uses a different permutation in order to obtain the same calculationemb = torch.cat((freqs, freqs), dim=-1)self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False)self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False)def forward(self, x, seq_len=None):# x: [bs, num_attention_heads, seq_len, head_size]if seq_len> self.max_seq_len_cached:self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype)return (self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype),self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype),)

上头第18行核心一句根据输出核苷酸阔度转化每个右边的 positon idx在bfloat16 下转化成右边摩擦

Python# self.inv_freq.dtype == torch.bfloat16 when bfloat16 is enabled during trainingt = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype)

在实际锻炼时如果开了bfloat16, self.inv_freq的 dtype则会被应运而生bfloat16, 我们可以通过简便的编码来看一下右边摩擦的疑虑

Pythont = torch.arange(4096, dtype=torch.float32)plt.scatter(t[-100:], t[-100:].to(torch.bfloat16).float(),s=0.8)plt.xlabel('position in float32')plt.ylabel('position in bfloat16')

示意图9-bfloat16右边摩擦示意示意图

根据bfloat16的声称灵敏度可知,锻炼(解答)时实例阔度越长,右边字符摩擦的情况越不堪重负,阔度为8192的实例解答里面,仅大约10%的token右边字符是正确的,好在右边字符摩擦有连续适度适度的人格特质,只有若干个北边的token才则会资源共享同一个position Embedding, 在更大的尺度上,各不相同右边的token 还是有一定的区分适度。

示意图10-各不相同实例视窗下右边字符正确token所占比率

除了RoPE右边字符提议,秋水笔记本电脑断定 Alibi 右边字符也长期存在上述疑虑,原因依然在于转化有理数的右边索引才则会在偏高灵敏度下转化成摩擦疑虑。

整修提议

RoPE整修

RoPE 的整修相对简便,只无需前提在转化 position_id的时候一定在float32的灵敏度上亦可。出处意:float32的tensor register_buffer后在锻炼时如果开端了bfloat16, 也则会被应运而生bfloat16

Pythonclass LlamaRotaryEmbedding(torch.nn.Module):def _init_(self, dim, max_position_embeddings=2048, base=10000, device=None):super()._init_()self.dim = dimself.max_position_embeddings = max_position_embeddingsself.base = baseself.inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim))# Build here to make 于大torch.jit.trace于大 work.self._set_cos_sin_cache(seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype())def _set_cos_sin_cache(self, seq_len):self.max_seq_len_cached = seq_lent = torch.arange(self.max_seq_len_cached, device=self.inv_freq.device, dtype=torch.float32)freqs = torch.outer(t, self.inv_freq)# Different from paper, but it uses a different permutation in order to obtain the same calculationemb = torch.cat((freqs, freqs), dim=-1)self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False)self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False)def forward(self, x, seq_len=None):# x: [bs, num_attention_heads, seq_len, head_size]if seq_len> self.max_seq_len_cached:self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype)return (self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype),self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype),)

Alibi整修

Alibi右边字符整修思路和RoPE的整修思路保持一致,但因为Alibi的 attention bias如此一来延在 attention matrix上头,如果按照上头的整修思路,attention matrix的种类需要和attention bias 保持一致,导致整个attention的计算都在float32种类上计算,这则会前所未有的拖慢锻炼速度目前非主流的attention减慢作法flashattention不全力支持 attention bias数最大值, 而 xformers要求attention bias种类需要与query.dtype相同,因此像RoPE那样简便的将attention bias种类提升到float32将则会前所未有的拖慢锻炼速度针对该疑虑秋水笔记本电脑设想了一种新的Alibi attention提议, 整个attention bias依然在bfloat16种类上,类似于sinusoidal的远程震荡人格特质,我们但会前提周边地区token右边字符的正确适度,对于相对东北方过远的的token我们则可以容忍其转化成一定的右边摩擦。本来的Alibi构建则相反,相对东北方越远的token声称越正确,相对东北方越近的token 则则会摩擦

示意图11- 整修前后alibi attention_bias折衷

整修视觉效果此处仅在解答阶段性对右边字符的灵敏度疑虑顺利进行整修【出处:锻炼阶段性可能也长期存在疑虑,取决锻炼的具体情况配置和作法】,可以看得见:在长实例的解答里面,数学模型的ppl 要显著比起整修前的pplBenchmark上测试者最近整修前后区别不小,可能是因为benchmark上测试者句法阔度有限,很少触发Position embedding的摩擦

Benchmark对比

Perplexity对比

在通用的句法原始数据上对修改前后数学模型在里面文句法上的困惑度顺利进行测试者,视觉效果如下:

其所:

Dongxu Zhang, Max Dong Wang. (2015). Relation Classification via Recurrent Neural Network.

Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Max Illia Polosukhin. (2023). Attention Is All You Need.

Zihang Dai, Zhilin Yang, Yiming Yang, Jaime Carbonell, Quoc V. Le, Max Ruslan Salakhutdinov. (2019). Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context.

Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, Max Peter J. Liu. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer.

Hugo Touvron, Thibaut Lril, Gautier Izacard, Xier Martinet, Marie-Anne Lachaux, Timothée Lacroix, Baptiste Rozière, Naman Goyal, Eric Hambro, Faisal Azhar, Aurelien Rodriguez, Armand Joulin, Edouard Gre, Max Guillaume Lample. (2023). LLaMA: Open and Efficient Foundation Language Models.

Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Max Yunfeng Liu. (2022). RoFormer: Enhanced Transformer with Rotary Position Embedding.

Ofir Press, Noah A. Smith, Max Mike Lewis. (2022). Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation.

Yutao Sun, Li Dong, Barun Patra, Shuming Ma, Shaohan Huang, Alon Benhaim, Vishr Chaudhary, Xia Song, Max Furu Wei. (2022). A Length-Extrapolatable Transformer.

_architecture_positional_encoding/

Shouyuan Chen, Sherman Wong, Liangjian Chen, Max Yuandong Tian. (2023). Extending Context Window of Large Language Models via Positional Interpolation.

_scaled_rope_allows_llama_models_to_he/

— 完 —

相对论适度位 QbitAI · 头条号经理人

八子补肾胶囊有用吗
益生菌和肠炎宁哪个效果好
藿香正气口服液和藿香正气水怎么选择
蒙脱石散与肠炎宁颗粒哪个好
肠炎宁颗粒的副作用
友情链接