【自然语言处理】【大模型】MPT模型结构源码解析(单机版)

相关博客
【自然语言处理】【大模型】MPT模型结构源码解析(单机版)
【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)
【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版)
【自然语言处理】【大模型】极低资源微调大模型方法LoRA以及BLOOM-LORA实现代码
【深度学习】【分布式训练】Collective通信操作及Pytorch示例
【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型
【自然语言处理】【大模型】大语言模型BLOOM推理工具测试
【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型
【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍
【自然语言处理】【大模型】BLOOM:一个176B参数且可开放获取的多语言模型
【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器
【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?
【自然语言处理】【ChatGPT系列】大模型的涌现能力

一、MPT介绍

​ MPT是由MosaicML团队开源出来了英文预训练大模型,共开源了4个模型:MPT-7B Base、MPT-7B-StoryWriter-65k+、MPT-7B-Instruct、MPT-7B-Chat。

1. 模型结构与预训练

  • MPT-7B Base是一个GPT风格的decoder-only Transformer模型,参数量为6.7B,使用了1T tokens进行预训练;
  • 使用了440张A100x40G的GPU训练了9.5天;
  • 使用ALiBi而不是位置编码,除了可以提供外推长度外,也能提高对loss spike的适应性;
  • 优化器使用Lion而不是AdamW,能提供更加稳定的更新幅度且减少优化器缓存占用的一半;
  • 通过使用FlashAttention、低精度LayerNorm层和FasterTransformer实现更快的推理;

2. 使用的数据

请添加图片描述

3. 效果

在这里插入图片描述

4. 不同版本的模型

​ MPT-7B Base是预训练语言模型,也是其他模型的基础;

​ MPT-7B-StoryWriter-65k+则是用长度为65k+的书籍语料微调的模型,得益于ALiBi的外推能力,其能够外推至84k的tokens;

​ MPT-7B-Instruct是一个经过指令微调的模型;

​ MPT-7B-Chat是一个对话模型,微调数据包括:ShareGPT-Vicuna、HC3、Alpaca、Helpful and Harmless以及Evol-Instruct;

二、模型结构

1. Layer Norm

​ 虽然MPT在推理时,使用的是低精度LayerNorm。但是代码实现中,也提供了RMSNorm。因此,这里会简单介绍其实现的各类Norm。代码位于https://huggingface.co/mosaicml/mpt-7b/blob/main/norm.py。

1.1 标准Layer Norm

​ 在Transformer中LayerNorm是对**(batch_size, seq_length, hidden_size)**中的hidden_size维度进行normalize。具体来说,给定一个向量 x \textbf{x} x,则normalize的过程为:
y = x − E ( x ) Var ( x ) + ϵ ∗ γ + β \textbf{y}=\frac{\textbf{x}-\text{E}(\textbf{x})}{\sqrt{\text{Var}(\textbf{x})+\epsilon}}*\gamma+\beta \\ y=Var(x)+ϵ xE(x)γ+β
其中, E ( x ) \text{E}(\textbf{x}) E(x)表示向量 x \textbf{x} x的期望, Var ( x ) \text{Var}(\textbf{x}) Var(x)是向量 x \textbf{x} x的方差, ϵ \epsilon ϵ是为了防止分母为0的偏置项, γ \gamma γ β \beta β是两个可学习参数。

def _cast_if_autocast_enabled(tensor):"""自动转换tensor的数据类型,用来实现后续的低精度LayerNorm。"""if torch.is_autocast_enabled():if tensor.device.type == 'cuda':dtype = torch.get_autocast_gpu_dtype()elif tensor.device.type == 'cpu':dtype = torch.get_autocast_cpu_dtype()else:raise NotImplementedError()return tensor.to(dtype=dtype)return tensorclass LPLayerNorm(torch.nn.LayerNorm):"""低精度LayerNorm,也输入和LayerNorm的参数转换为低精度"""def __init__(self, normalized_shape, eps=1e-05, elementwise_affine=True, device=None, dtype=None):super().__init__(normalized_shape=normalized_shape, eps=eps, elementwise_affine=elementwise_affine, device=device, dtype=dtype)def forward(self, x):module_device = x.device# 将输入和LayerNorm的参数都转换为低精度downcast_x = _cast_if_autocast_enabled(x)downcast_weight = _cast_if_autocast_enabled(self.weight) if self.weight is not None else self.weightdowncast_bias = _cast_if_autocast_enabled(self.bias) if self.bias is not None else self.biaswith torch.autocast(enabled=False, device_type=module_device.type):return torch.nn.functional.layer_norm(downcast_x, self.normalized_shape, downcast_weight, downcast_bias, self.eps)
1.2 RMS Norm

​ 相比于LayerNorm,RMS Norm主要是去掉了减均值的部分。
y = x RMS ( x ) RMS ( x ) = 1 n ∑ i = 1 n x i 2 \begin{align} \textbf{y}&=\frac{\textbf{x}}{\text{RMS}(\textbf{x})} \\ \text{RMS}(\textbf{x})&=\sqrt{\frac{1}{n}\sum_{i=1}^n x_i^2} \end{align} \\ yRMS(x)=RMS(x)x=n1i=1nxi2

def rms_norm(x, weight=None, eps=1e-05):"""RMS的实现"""output = x / torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + eps)if weight is not None:return output * weightreturn outputclass RMSNorm(torch.nn.Module):def __init__(self, normalized_shape, eps=1e-05, weight=True, dtype=None, device=None):super().__init__()self.eps = epsif weight:self.weight = torch.nn.Parameter(torch.ones(normalized_shape, dtype=dtype, device=device))else:self.register_parameter('weight', None)def forward(self, x):return rms_norm(x.float(), self.weight, self.eps).to(dtype=x.dtype)class LPRMSNorm(RMSNorm):"""低精度RMS Norm的实现"""def __init__(self, normalized_shape, eps=1e-05, weight=True, dtype=None, device=None):super().__init__(normalized_shape=normalized_shape, eps=eps, weight=weight, dtype=dtype, device=device)def forward(self, x):downcast_x = _cast_if_autocast_enabled(x)downcast_weight = _cast_if_autocast_enabled(self.weight) if self.weight is not None else self.weightwith torch.autocast(enabled=False, device_type=x.device.type):return rms_norm(downcast_x, downcast_weight, self.eps).to(dtype=x.dtype)
NORM_CLASS_REGISTRY = {'layernorm': torch.nn.LayerNorm, 'low_precision_layernorm': LPLayerNorm, 'rmsnorm': RMSNorm, 'low_precision_rmsnorm': LPRMSNorm}

2. 自注意力

​ 虽然MPT中仍然使用多头注意力,但是其同时实现了"多头注意力"和"多Query注意力",并且提供了纯torch、flash_attn和triton_flash_attn的实现。这里会介绍所有这些实现,代码位于https://huggingface.co/mosaicml/mpt-7b/blob/main/attention.py。

2.1 三个版本的Self-Attention实现

​ 自注意力机制的原理如下:
Q = W q X K = W k X V = W v X Attention ( Q , K , V ) = softmax ( Q K T d k ) V \begin{align} Q &= W_q X \\ K &= W_k X \\ V &= W_v X \\ \text{Attention}(Q,K,V) &= \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V \end{align} \\ QKVAttention(Q,K,V)=WqX=WkX=WvX=softmax(dk QKT)V
其中, X X X是输入, W q W_q Wq W k W_k Wk W v W_v Wv分别是query、key、value的投影矩阵。

纯torch版本
def scaled_multihead_dot_product_attention(query, # [batch_size, seq_length, (head_num*head_dim)]key, # 在Multi-Head Attention中形状同query,在Multi-Query Attention中head_num=1value, # 在Multi-Head Attention中形状同query,在Multi-Query Attention中head_num=1n_heads, # 注意力头的数量softmax_scale=None, # 注意力分数的缩放因子attn_bias=None, # 注意力分数的额外偏置项key_padding_mask=None,is_causal=False, # 是否为causal,决定了注意力mask的类型dropout_p=0.0, multiquery=False, # 是否是Mulit-Query Attentiontraining=False, needs_weights=False):# 通过rearrange函数重塑query、key、value的形状# 这里的重塑过程同时包括了拆分多头以及调整维度的顺序q = rearrange(query, 'b s (h d) -> b h s d', h=n_heads)# 在Mulit-Query Attention中, h=1,也就是多个头共享同一份key和valuek = rearrange(key, 'b s (h d) -> b h d s', h=1 if multiquery else n_heads)v = rearrange(value, 'b s (h d) -> b h s d', h=1 if multiquery else n_heads)min_val = torch.finfo(q.dtype).min# b: batch_size, s_q: seq_length, d: head_dim(b, _, s_q, d) = q.shapes_k = k.size(-1)# 若没有指定softmax的缩放因子,则是默认的因子if softmax_scale is None:softmax_scale = 1 / math.sqrt(d)# 得到未经过softmax规范化的注意力权重attn_weight = q.matmul(k) * softmax_scale# 将注意力偏置项添加到注意力分数attn_weight上if attn_bias is not None:if attn_bias.size(-1) != 1 and attn_bias.size(-1) != s_k or (attn_bias.size(-2) != 1 and attn_bias.size(-2) != s_q):raise RuntimeError(f'attn_bias (shape: {attn_bias.shape}) is expected to broadcast to shape: {attn_weight.shape}.')attn_weight = attn_weight + attn_bias# 应用key padding maskif key_padding_mask is not None:if attn_bias is not None:warnings.warn('Propogating key_padding_mask to the attention module ' + 'and applying it within the attention module can cause ' + 'unneccessary computation/memory usage. Consider integrating ' + 'into attn_bias once and passing that to each attention ' + 'module instead.')attn_weight = attn_weight.masked_fill(~key_padding_mask.view((b, 1, 1, s_k)), min_val)# 是否使用causal mask(关于causal mask可以见文章https://zhuanlan.zhihu.com/p/625911234)if is_causal:s = max(s_q, s_k)# 全1矩阵causal_mask = attn_weight.new_ones(s, s, dtype=torch.float16)causal_mask = causal_mask.tril()causal_mask = causal_mask.to(torch.bool)causal_mask = ~causal_maskcausal_mask = causal_mask[-s_q:, -s_k:]attn_weight = attn_weight.masked_fill(causal_mask.view(1, 1, s_q, s_k), min_val)# softmaxattn_weight = torch.softmax(attn_weight, dim=-1)# dropoutif dropout_p:attn_weight = torch.nn.functional.dropout(attn_weight, p=dropout_p, training=training, inplace=True)out = attn_weight.matmul(v)out = rearrange(out, 'b h s d -> b s (h d)')if needs_weights:return (out, attn_weight)return (out, None)
FlashAttention

​ 在标准的自注意力计算中,有一些中间计算结果 S S S P P P
S = Q K ⊤ P = Softmax ( S ) S=QK^\top \\ P=\text{Softmax}(S) \\ S=QKP=Softmax(S)

这些中间结果需要通过高带宽内存(HBM)进行存取,FlashAttention主要是通过减少对HBM的访问次数来优化速度。这里不展开介绍该技术的实现,其通过调用包flash_attn即可实现,在MPT的代码中对其进行了简单的封装flash_attn_fn

TritonFlashAttention

​ 使用Triton实现的FlashAttention,也可以通过调用flash_attn来实现,在MPT代码中封装为triton_flash_attn_fn

2.2 多头注意力

​ 多头注意力就是将多个自注意力的结果合并,如下:
head i = Attention ( Q i , K i , V i , A i ) MultiHead ( Q , K , V , A ) = Concat ( head 1 , … , head h ) W o \begin{align} \text{head}_i&=\text{Attention}(Q_i,K_i,V_i,A_i) \\ \text{MultiHead}(Q,K,V,A)&=\text{Concat}(\text{head}_1,\dots,\text{head}_h)W_o \end{align} \\ headiMultiHead(Q,K,V,A)=Attention(Qi,Ki,Vi,Ai)=Concat(head1,,headh)Wo

class MultiheadAttention(nn.Module):def __init__(self, d_model: int, n_heads: int, attn_impl: str='triton', clip_qkv: Optional[float]=None, qk_ln: bool=False, softmax_scale: Optional[float]=None, attn_pdrop: float=0.0, low_precision_layernorm: bool=False, device: Optional[str]=None):super().__init__()self.attn_impl = attn_impl #注意力的实现方式self.clip_qkv = clip_qkv # query、key、value是否进行clipself.qk_ln = qk_ln # 是否对query和key进行LayerNormself.d_model = d_modelself.n_heads = n_heads # 注意力头的数量self.softmax_scale = softmax_scale # softmax缩放因子if self.softmax_scale is None:self.softmax_scale = 1 / math.sqrt(self.d_model / self.n_heads)self.attn_dropout_p = attn_pdrop# 投影层self.Wqkv = nn.Linear(self.d_model, 3 * self.d_model, device=device)fuse_splits = (d_model, 2 * d_model)self.Wqkv._fused = (0, fuse_splits)if self.qk_ln:# 初始化query和key的LayerNormlayernorm_class = LPLayerNorm if low_precision_layernorm else nn.LayerNormself.q_ln = layernorm_class(self.d_model, device=device)self.k_ln = layernorm_class(self.d_model, device=device)if self.attn_impl == 'flash':self.attn_fn = flash_attn_fnelif self.attn_impl == 'triton':self.attn_fn = triton_flash_attn_fnelif self.attn_impl == 'torch':self.attn_fn = scaled_multihead_dot_product_attentionelse:raise ValueError(f'attn_impl={attn_impl!r} is an invalid setting.')# 输出投影层self.out_proj = nn.Linear(self.d_model, self.d_model, device=device)self.out_proj._is_residual = Truedef forward(self, x, past_key_value=None, attn_bias=None, attention_mask=None, is_causal=True, needs_weights=False):# 投影获得query、key、valueqkv = self.Wqkv(x)# 对query、key和value进行clip(MPT并没有使用该选项)if self.clip_qkv:qkv.clamp_(min=-self.clip_qkv, max=self.clip_qkv)# 将query、key和value中qkv中拆分出来(query, key, value) = qkv.chunk(3, dim=2)key_padding_mask = attention_maskif self.qk_ln:# 对query和key进行LayerNorm(MPT并没有使用该选项)dtype = query.dtypequery = self.q_ln(query).to(dtype)key = self.k_ln(key).to(dtype)# 推理时,会将前面token的key和value传递过来,这里进行合并if past_key_value is not None:if len(past_key_value) != 0:key = torch.cat([past_key_value[0], key], dim=1)value = torch.cat([past_key_value[1], value], dim=1)past_key_value = (key, value)if attn_bias is not None:attn_bias = attn_bias[:, :, -query.size(1):, -key.size(1):]# 执行自注意力(context, attn_weights) = self.attn_fn(query, key, value, self.n_heads, softmax_scale=self.softmax_scale, attn_bias=attn_bias, key_padding_mask=key_padding_mask, is_causal=is_causal, dropout_p=self.attn_dropout_p, training=self.training, needs_weights=needs_weights)return (self.out_proj(context), attn_weights, past_key_value)
2.3 多Query注意力

​ 在多头注意力中,每个头都有自己独立的query、key和value。多Query注意力中,各个头之间共享key和value。所以,多Query注意力的参数量要比多头注意力少。多Query注意力和多头注意力的实现非常类似,仅有少量的不同,这里仅展示代码中不同的部分:

class MultiQueryAttention(nn.Module):def __init__(self, d_model: int, n_heads: int, attn_impl: str='triton', clip_qkv: Optional[float]=None, qk_ln: bool=False, softmax_scale: Optional[float]=None, attn_pdrop: float=0.0, low_precision_layernorm: bool=False, device: Optional[str]=None):super().__init__()...# 计算每个头的维度self.head_dim = d_model // n_heads...# 投影层与多头注意力具有明显区别,多头注意力的输出维度为3*d_model,而这里是d_model + 2*head_dimself.Wqkv = nn.Linear(d_model, d_model + 2 * self.head_dim, device=device)...

3. 位置偏差ALiBi

​ MPT使用ALiBi的方式向模型注入位置信息。ALiBi注入位置信息的方式是在注意力分数矩阵添加一个偏差(bias)来实现的。具体来说,给定一个长度为L的输入序列, 那么每个注意力头的第i个query q i ∈ R 1 × d ( 1 ≤ i ≤ L ) \textbf{q}_i\in\mathbb{R}^{1\times d}(1\leq i\leq L) qiR1×d(1iL)针对前i个key K ∈ R i × d \textbf{K}\in\mathbb{R}^{i\times d} KRi×d的注意力分数为

softmax ( q i K ⊤ ) \text{softmax}(\textbf{q}_i\textbf{K}^\top) \\ softmax(qiK)
在使用ALiBi时,不需要向网络添加位置嵌入。仅需要在query-key点积中添加静态偏差即可。
softmax ( q i K ⊤ + m ⋅ [ − ( i − 1 ) , … , − 2 , − 1 , 0 ] ) \text{softmax}(\textbf{q}_i\textbf{K}^\top+m\cdot[-(i-1),\dots,-2,-1,0]) \\ softmax(qiK+m[(i1),,2,1,0])
其中m是与注意力头相关的斜率(slope),也就是超参; [ − ( i − 1 ) , … , − 2 , − 1 , 0 ] [-(i-1),\dots,-2,-1,0] [(i1),,2,1,0]其实就是 q i \textbf{q}_i qi与各个key的相对距离。

​ 对于8个注意力头,m是等比序列: 1 2 1 , 1 2 2 , … , 1 2 8 \frac{1}{2^1},\frac{1}{2^2},\dots,\frac{1}{2^8} 211,221,,281。对于16个注意力头的模型,m则是等比序列: 1 2 0.5 , 1 2 1 , 1 2 1.5 , … , 1 2 8 \frac{1}{2^{0.5}},\frac{1}{2^1},\frac{1}{2^{1.5}},\dots,\frac{1}{2^8} 20.51,211,21.51,,281

def gen_slopes(n_heads, alibi_bias_max=8, device=None):"""计算斜率"""# _n_heads是与n_heads接近的2的次数,例如:n_heads为5/6/7时,_n_heads为8_n_heads = 2 ** math.ceil(math.log2(n_heads))m = torch.arange(1, _n_heads + 1, dtype=torch.float32, device=device)# m是alibi_bias_max/_n_heads到alibi_bias_max的等差数列m = m.mul(alibi_bias_max / _n_heads)# 计算斜率slopes = 1.0 / torch.pow(2, m)if _n_heads != n_heads:slopes = torch.concat([slopes[1::2], slopes[::2]])[:n_heads]return slopes.view(1, n_heads, 1, 1)def build_alibi_bias(n_heads, seq_len, full=False, alibi_bias_max=8, device=None, dtype=None):"""构建alibi注意力偏差"""alibi_bias = torch.arange(1 - seq_len, 1, dtype=torch.int32, device=device).view(1, 1, 1, seq_len)if full:alibi_bias = alibi_bias - torch.arange(1 - seq_len, 1, dtype=torch.int32, device=device).view(1, 1, seq_len, 1)alibi_bias = alibi_bias.abs().mul(-1)slopes = gen_slopes(n_heads, alibi_bias_max, device=device)alibi_bias = alibi_bias * slopesreturn alibi_bias.to(dtype=dtype)def build_attn_bias(attn_impl, attn_bias, n_heads, seq_len, causal=False, alibi=False, alibi_bias_max=8):"""该函数只是对`build_alibi_bias`进行了封装,由于flash版本的注意力不支持attn_bias所以返回none"""if attn_impl == 'flash':return Noneelif attn_impl in ['torch', 'triton']:if alibi:(device, dtype) = (attn_bias.device, attn_bias.dtype)attn_bias = attn_bias.add(build_alibi_bias(n_heads, seq_len, full=not causal, alibi_bias_max=alibi_bias_max, device=device, dtype=dtype))return attn_biaselse:raise ValueError(f'attn_impl={attn_impl!r} is an invalid setting.')

4. MLP层

MLP ( X ) = GELU ( X W 1 ) W 2 \text{MLP}(X) = \text{GELU}(XW_1)W_2 \\ MLP(X)=GELU(XW1)W2

class MPTMLP(nn.Module):def __init__(self, d_model: int, expansion_ratio: int, device: Optional[str]=None):super().__init__()self.up_proj = nn.Linear(d_model, expansion_ratio * d_model, device=device)self.act = nn.GELU(approximate='none')self.down_proj = nn.Linear(expansion_ratio * d_model, d_model, device=device)self.down_proj._is_residual = Truedef forward(self, x):return self.down_proj(self.act(self.up_proj(x)))

5. MPTBlock层

在这里插入图片描述

class MPTBlock(nn.Module):def __init__(self, d_model: int, n_heads: int, expansion_ratio: int, attn_config: Dict={'attn_type': 'multihead_attention', 'attn_pdrop': 0.0, 'attn_impl': 'triton', 'qk_ln': False, 'clip_qkv': None, 'softmax_scale': None, 'prefix_lm': False, 'attn_uses_sequence_id': False, 'alibi': False, 'alibi_bias_max': 8}, resid_pdrop: float=0.0, norm_type: str='low_precision_layernorm', device: Optional[str]=None, **kwargs):del kwargssuper().__init__()# LayerNorm的类别norm_class = NORM_CLASS_REGISTRY[norm_type.lower()]# 注意力的类别attn_class = ATTN_CLASS_REGISTRY[attn_config['attn_type']]# LayerNormself.norm_1 = norm_class(d_model, device=device)# 注意力self.attn = attn_class(attn_impl=attn_config['attn_impl'], clip_qkv=attn_config['clip_qkv'], qk_ln=attn_config['qk_ln'], softmax_scale=attn_config['softmax_scale'], attn_pdrop=attn_config['attn_pdrop'], d_model=d_model, n_heads=n_heads, device=device)# LayerNormself.norm_2 = norm_class(d_model, device=device)# MLP层self.ffn = MPTMLP(d_model=d_model, expansion_ratio=expansion_ratio, device=device)self.resid_attn_dropout = nn.Dropout(resid_pdrop)self.resid_ffn_dropout = nn.Dropout(resid_pdrop)def forward(self, x: torch.Tensor, past_key_value: Optional[Tuple[torch.Tensor]]=None, attn_bias: Optional[torch.Tensor]=None, attention_mask: Optional[torch.ByteTensor]=None, is_causal: bool=True) -> Tuple[torch.Tensor, Optional[Tuple[torch.Tensor]]]:a = self.norm_1(x)(b, _, past_key_value) = self.attn(a, past_key_value=past_key_value, attn_bias=attn_bias, attention_mask=attention_mask, is_causal=is_causal)x = x + self.resid_attn_dropout(b)m = self.norm_2(x)n = self.ffn(m)x = x + self.resid_ffn_dropout(n)return (x, past_key_value)

6. MPTModel

​ MPTModel的代码比较多,这里就不贴完整代码了,介绍一下主要的结构和值得关注的点。

Shrink Embedding Gradient

​ Shrink Embedding Gradient技术来自于GLM-130B,用于稳定预训练,防止出现loss峰值。MPT在代码中也支持该技术,但并没有使用

# 当self.embedding_fraction小于1时,执行该段代码
# x接收到的梯度缩减为self.embedding_fraction
x_shrunk = x * self.embedding_fraction + x.detach() * (1 - self.embedding_fraction)
assert isinstance(self.emb_drop, nn.Module)
# embedding dropout
x = self.emb_drop(x_shrunk)
模型结构相关的代码
# embedding
tok_emb = self.wte(input_ids)
x = tok_emb
# embedding dropout
x = self.emb_drop(x)
# 计算alibi的注意力偏差
(attn_bias, attention_mask) = self._attn_bias(device=x.device, dtype=x.dtype, attention_mask=attention_mask, prefix_mask=prefix_mask, sequence_id=sequence_i)
# 多个block的前向传播
for (b_idx, block) in enumerate(self.blocks):past_key_value = past_key_values[b_idx] if past_key_values is not None else None(x, past_key_value) = block(x, past_key_value=past_key_value, attn_bias=attn_bias, attention_mask=attention_mask, is_causal=self.is_causal)if past_key_values is not None:past_key_values[b_idx] = past_key_value
# 最后的输出进行LayerNorm
x = self.norm_f(x)

参考资料

https://www.mosaicml.com/blog/mpt-7b#training-stability

https://huggingface.co/mosaicml/mpt-7b/tree/main

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

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

相关文章

Cesium 空间量算——生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标,并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…

【链表】排序链表-力扣148题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

思维链(Chain-of-Thought Prompting Elicits Reasoning in Large Language Models)

概括 论文主要描述了一种用思维链的提升LLM模型推理能力的方式,并且通过实验的方式,证明了思维链在算术、常识和符号等任务方面的显著效果。仅通过540B大小的PaLM模型,通过8个思维链样例就可以实现在GSM8K上的sota效果。 具体工作 这篇论文…

OpenGLES:使用纹理绘制一张图片

一.概述 最近疏于写博客,接下来会陆续更新这段时间OpenGLES的一些开发过程。 前两篇OpenGLES的博客讲解了怎样使用OpenGLES实现相机普通预览和多宫格滤镜 在相机实现过程中,虽然使用到了纹理,但只是在生成一个纹理之后,使用纹理…

精华回顾:Web3 前沿创新者在 DESTINATION MOON 共话未来

9 月 17 日,由 TinTinLand 主办的「DESTINATION MOON: Web3 Dev Summit Shanghai 2023」线下活动在上海黄浦如约而至。 本次 DESTINATION MOON 活动作为 2023 上海区块链国际周的 Side Event,设立了 4 场主题演讲与 3 个圆桌讨论,聚集了诸多…

Goby 漏洞发布|Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞(CVE-2019-5434)

漏洞名称:Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞(CVE-2019-5434) English Name: Revive Adserver adxmlrpc.php Remote Code Execution Vulnerability (CVE-2019-5434) CVSS core: 9.0 影响资产数&a…

【自学记录】深度学习入门——基于Python的理论与实现(第3章 神经网络)

3.4.3 3层神经网络Python实现 实现的是这个网络 **init_network()**函数会进行权重和偏置的初始化,并将它们保存在字典变量network中。这个字典变量network中保存了每一层所需的参数(权重和偏置)。 **forward()**函数中则封装了将输入信号转换为输出信号的处理过程…

ReadPaper论文阅读工具

之前看文献一直用的EndNote嘛,但是突然发现了它的一个弊端,就是说每次没看完退出去之后,下次再接着看的时候它不能保留我上一次的位置信息,又要重头开始翻阅,这让我感到很烦躁哈哈。(当然也不知道是不是我哪…

MySQL数据库简介+库表管理操作+数据库用户管理

Mysql Part 1 一、数据库的基本概念1.1 使用数据库的必要性1.2 数据库基本概念1.2.1 数据(Data)1.2.2 表1.2.3 数据库1.2.4 数据库管理系统(DBMS)1.2.5 数据库系统 1.3 数据库的分类1.3.1 关系数据库 SQL1.3.2 非关系数据库 NoSQL…

C语言自定义类型详解(1)结构体知识汇总

本篇概要 本篇主要讲述C语言结构体的相关知识,包括结构体的基本声明,结构体的匿名结构,结构体的自引用,结构体变量的定义和初始化以及结构体的内存对齐等相关知识。 文章目录 本篇概要1.结构体1.1结构体的基本声明1.2结构体的特殊…

[SQL Server]在应使用条件的上下文(在 ‘)‘ 附近)中指定了非布尔类型的表达式,查询时间大于某个数值时

这种条件查询条件里面不要有空格&#xff0c;一个也不要有 这种条件查询条件里面不要有空格&#xff0c;一个也不要有 $giftsDb::table(drawgot)->where(disabtime,<,"2030-01-03")->select();

合肥先进光源国家重大科技基础设施项目及配套工程启动会纪念

合肥先进光源国家重大科技基础设施项目及配套工程启动会纪念 卡西莫多 合肥长丰岗集里 肥鸭从此别泥塘 先平场地设围栏 进而工地筑基忙 光阴似箭指日争 源流汇智山水长 国器西北扩新地 家校又添新区园 重器托举有群力 大步穿梭两地间 科教兴邦大国策 技术盈身坦荡行…

【数据结构】—交换排序之快速排序究极详解,手把手带你从简单的冒泡排序升级到排序的难点{快速排序}(含C语言实现)

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f525;这就不得不推荐此专栏了&#xff1a;C语言 ♈️今日夜电波&#xff1a;靴の花火—ヨルシカ 0:28━━━━━━️&#x1f49f;──────── 5:03 …

Eureka服务器注册

一。Eureka服务器注册 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mav…

Android之MediaMetricsService实现本质(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

移动端H5封装一个 ScrollList 横向滚动列表组件,实现向左滑动

效果&#xff1a; 1.封装组件&#xff1a; <template><div class"scroll-list"><divclass"scroll-list-content":style"{ background, color, fontSize: size }"ref"scrollListContent"><div class"scroll…

Python150题day08

2.基础语法篇 2.1 if 条件句 ①单个条件分支 使用input函数接收用户的输入&#xff0c;如果用户输入的整数是偶数&#xff0c;则使用print函数输出"你输入的整数是:{value],它是偶数”&#xff0c;[value]部分要替换成用户的输入。 解答: value input("请输⼊⼀…

Jmeter——结合Allure展示测试报告

在平时用jmeter做测试时&#xff0c;生成报告的模板&#xff0c;不是特别好。大家应该也知道allure报告&#xff0c;页面美观。 先来看效果图&#xff0c;报告首页&#xff0c;如下所示&#xff1a; 报告详情信息&#xff0c;如下所示&#xff1a; 运行run.py文件&#xff0c;…

在React中,什么是组件的状态(state)?如何更新组件的状态?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建和初始化状态⭐ 更新状态⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

【PyTorch攻略(2/7)】 加载数据集

一、说明 PyTorch提供了两个数据原语&#xff1a;torch.utils.data.DataLoader和torch.utils.data.Dataset&#xff0c;允许您使用预加载的数据集以及您自己的数据。数据集存储样本及其相应的标签&#xff0c;DataLoader 围绕数据集包装一个可迭代对象&#xff0c;以便轻松访问…