Meta Llama 3 大型语言模型的超参数

Meta Llama 3 大型语言模型的超参数

flyfish

介绍
https://github.com/meta-llama/llama3

我们正在释放大型语言模型的潜力。最新版本的Llama现已向个人、创作者、研究人员和各类企业开放,帮助他们负责任地进行实验、创新和规模化实现他们的想法。

此次发布包括预训练和指令调优的Llama 3语言模型的模型权重和起始代码,模型参数规模从80亿到700亿不等。

原始 Transformer 的超参数

d_model = 512
num_layers = 6
num_attention_heads = 8
ffn_hidden_dim = 2048  # 4 * d_model
norm_eps = 1e-6
max_seq_len = 512

Llama 3 示例的超参数

dim = 4096
n_layers = 32
n_heads = 32
n_kv_heads = None  # 或者是另外设定的值
vocab_size = -1  # 通常需要具体设定
multiple_of = 256
ffn_dim_multiplier = None  # 或者是另外设定的值
norm_eps = 1e-5
rope_theta = 500000
max_batch_size = 32
max_seq_len = 2048

配置源码

@dataclass
class ModelArgs:
    dim: int = 4096
    n_layers: int = 32
    n_heads: int = 32
    n_kv_heads: Optional[int] = None
    vocab_size: int = -1
    multiple_of: int = 256  # make SwiGLU hidden layer size multiple of large power of 2
    ffn_dim_multiplier: Optional[float] = None
    norm_eps: float = 1e-5
    rope_theta: float = 500000

    max_batch_size: int = 32
    max_seq_len: int = 2048

这段代码定义了一个数据类 ModelArgs,用于存储和管理模型的参数配置。数据类(dataclass)是一种便捷的方式来创建类,这些类主要用作数据容器。下面是对每个参数的解释:

dim: int = 4096

模型的隐藏层维度,表示每层中有多少个神经元。
n_layers: int = 32

模型的层数,表示网络中有多少层(通常是Transformer的层数)。
n_heads: int = 32

注意力头的数量,表示在多头注意力机制中,有多少个独立的注意力头。
n_kv_heads: Optional[int] = None

可选的键和值的头数。如果设置为 None,则使用默认的注意力头数(n_heads)。
vocab_size: int = -1

词汇表的大小,通常在语言模型中用于定义词汇表的总数。初始化时可能使用 -1 表示未指定。
multiple_of: int = 256

SwiGLU(Swish-Gated Linear Unit)隐藏层大小必须是该值的倍数,通常是为了优化计算效率和内存对齐。
ffn_dim_multiplier: Optional[float] = None

前馈神经网络(FFN)维度的乘数。通常用于调整FFN层的大小。
norm_eps: float = 1e-5

用于层归一化的epsilon值,防止除零错误的小常数。
rope_theta: float = 500000

RoPE(Rotary Positional Encoding)中的theta参数,控制位置编码的参数。
max_batch_size: int = 32

最大批处理大小,指一次前向或后向传播中可以处理的样本数量。
max_seq_len: int = 2048

最大序列长度,指模型可以处理的最大输入序列长度。

@dataclass 是 Python 的 dataclasses 模块中的一个装饰器,用于简化类的定义,尤其是那些主要用于存储数据的类。使用 @dataclass 可以自动生成一些常见的特殊方法,如 initrepreq 等,从而减少了样板代码,提高了代码的可读性和维护性。

下面是一个 @dataclass 的使用示例:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    email: str

# 创建 Person 类的实例
person1 = Person(name="Alice", age=30, email="alice@example.com")
person2 = Person(name="Bob", age=25, email="bob@example.com")

# 自动生成的 __repr__ 方法会生成易读的字符串表示
print(person1)  # 输出:Person(name='Alice', age=30, email='alice@example.com')

# 自动生成的 __eq__ 方法允许比较两个实例是否相等
print(person1 == person2)  # 输出:False

# 自动生成的 __init__ 方法使得初始化实例变得简单
person3 = Person("Charlie", 35, "charlie@example.com")
print(person3)  # 输出:Person(name='Charlie', age=35, email='charlie@example.com')

输出结果

Person(name='Alice', age=30, email='alice@example.com')
False
Person(name='Charlie', age=35, email='charlie@example.com')

在 Python 中,前后带双下划线的名称通常称为 “魔术方法”(或 “特殊方法”)。这些方法是 Python 内置的方法,具有特定的用途和行为,通常用于实现类的某些特性或操作。以下是一些常见的魔术方法及其含义:

__init__:

构造方法,用于初始化对象。当创建一个新的类实例时会自动调用。

class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(10)  # __init__ 方法被调用

repr:

返回对象的“官方”字符串表示,主要用于调试。

str:

返回对象的“非正式”字符串表示,适合人类阅读。当使用 print() 或 str() 时调用。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __repr__(self):
        return f"MyClass(value={self.value})"

    def __str__(self):
        return f"Value is {self.value}"

    def __eq__(self, other):
        return self.value == other.value

    def __lt__(self, other):
        return self.value < other.value

# 创建 MyClass 类的实例
obj1 = MyClass(10)
obj2 = MyClass(20)

# 使用 __repr__ 方法
print(repr(obj1))  # 输出:MyClass(value=10)

# 使用 __str__ 方法
print(str(obj1))  # 输出:Value is 10

# 使用 __eq__ 方法
print(obj1 == obj2)  # 输出:False

# 使用 __lt__ 方法
print(obj1 < obj2)  # 输出:True

# 示例哈希方法
class MyClassWithHash:
    def __init__(self, value):
        self.value = value

    def __hash__(self):
        return hash(self.value)

# 创建 MyClassWithHash 类的实例
obj3 = MyClassWithHash(10)
print(hash(obj3))  # 输出:10(或与值相关的哈希值)

输出

MyClass(value=10)
Value is 10
False
True
10

编写调用示例

from dataclasses import dataclass
from typing import Optional

@dataclass
class ModelArgs:
    dim: int = 4096  # dim 是一个整数,默认值为 4096
    n_layers: int = 32  # n_layers 是一个整数,默认值为 32
    n_heads: int = 32  # n_heads 是一个整数,默认值为 32
    n_kv_heads: Optional[int] = None  # n_kv_heads 是一个可选整数,默认值为 None
    vocab_size: int = -1  # vocab_size 是一个整数,默认值为 -1
    multiple_of: int = 256  # multiple_of 是一个整数,默认值为 256
    ffn_dim_multiplier: Optional[float] = None  # ffn_dim_multiplier 是一个可选浮点数,默认值为 None
    norm_eps: float = 1e-5  # norm_eps 是一个浮点数,默认值为 1e-5
    rope_theta: float = 500000  # rope_theta 是一个浮点数,默认值为 500000

    max_batch_size: int = 32  # max_batch_size 是一个整数,默认值为 32
    max_seq_len: int = 2048  # max_seq_len 是一个整数,默认值为 2048

# 创建 ModelArgs 类的实例,使用默认值
args = ModelArgs()
print(args)

# 创建 ModelArgs 类的实例,提供部分参数值
custom_args = ModelArgs(dim=512, n_layers=16)
print(custom_args)

输出

ModelArgs(dim=4096, n_layers=32, n_heads=32, n_kv_heads=None, vocab_size=-1, multiple_of=256, ffn_dim_multiplier=None, norm_eps=1e-05, rope_theta=500000, max_batch_size=32, max_seq_len=2048)
ModelArgs(dim=512, n_layers=16, n_heads=32, n_kv_heads=None, vocab_size=-1, multiple_of=256, ffn_dim_multiplier=None, norm_eps=1e-05, rope_theta=500000, max_batch_size=32, max_seq_len=2048)

相关推荐

  1. Meta Llama 3 大型语言模型参数

    2024-06-07 01:52:03       28 阅读
  2. 掌握大型语言模型指南

    2024-06-07 01:52:03       43 阅读
  3. GPT-3下一步:大型语言模型未来方向

    2024-06-07 01:52:03       45 阅读
  4. GPT-3.5发布:大型语言模型进化与挑战

    2024-06-07 01:52:03       42 阅读
  5. 参数艺术:Mojo模型与动态参数调整

    2024-06-07 01:52:03       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 01:52:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 01:52:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 01:52:03       82 阅读
  4. Python语言-面向对象

    2024-06-07 01:52:03       91 阅读

热门阅读

  1. 源代码先转字节码,再转机器码的过程

    2024-06-07 01:52:03       32 阅读
  2. 【redis】set和zset常用命令

    2024-06-07 01:52:03       27 阅读
  3. Go 语言的控制结构:条件与循环

    2024-06-07 01:52:03       31 阅读
  4. python opencv运行报错

    2024-06-07 01:52:03       32 阅读
  5. python pytorch之torch.flip 按轴翻转/倒叙排列 方法

    2024-06-07 01:52:03       27 阅读
  6. mysql like 查询优化

    2024-06-07 01:52:03       25 阅读
  7. c++ 函数作为参数

    2024-06-07 01:52:03       31 阅读
  8. MTK 平台增加分区流程 及 注意事项

    2024-06-07 01:52:03       26 阅读
  9. 高通Android 12/Android 13截屏

    2024-06-07 01:52:03       31 阅读