Facebo推出的LLaMA模型

简介:

LLaMA(Lager Language Model From Meta),这是一个从7B到65B参数的基础语言模型的集合。它在数万亿的文本tokens上训练的模型,并表明在不求助于专有和不可访问的数据集,而仅使用公开的数据集来训练最先进的模型是可能的。特别是,LLaMA-13B在大多数基准测试上优于GPT-3(175B),而且LLaMA-65B与最好的型号钦奇利亚-70B和PaLM-540B具有竞争力。

LLaMA模型的目标是用一个较小的模型在更大数据集上进行更长时间的训练,以此来达到相同或更高精度的模型。因为小模型的推理成本更低,所以其部署时所需要的资源条件也更加便宜,这使得不具有高硬件资源的个人或机构也能研究LLMs。

数据集:

该模型使用以下数据源进行训练:CCNet [67%],C4 [15%],GitHub [4.5%],维斯百科 [4.5%],图书 [4.5%],ArXiv[2.5%],Stack Exchange[2%]。维基百科和书籍域包括以下语言的数据:保加利亚文,加泰罗尼亚文,捷克文,丹麦文,德文,英文,西班牙文,法文,克罗地亚文,匈牙利文,意大利文,荷兰文,波兰文,葡萄牙文,罗马尼亚文,俄文,斯洛文尼亚文,塞尔维亚文,瑞典文,乌克兰文。有关训练集和相应预处理的更多详细信息,请参阅论文

模型的超参数设置

模型用途

主要用途:LLaMA的主要用途是对大型语言模型的研究,包括: 探索潜在的应用,如问答、自然语言理解或阅读理解, 了解当前语言模型的功能和局限性,并开发改进这些功能和局限性的技术, 评估和减轻偏见、风险、有毒和有害内容的产生、幻觉。

主要目标用户:该模型的主要目标用户是自然语言处理、机器学习和人工智能领域的研究人员。

超出范围的用例:LLaMA是一个基础模型。因此,在没有进一步风险评估的情况下,不应将其用于下游应用程序。特别是,该模型没有经过人类反馈的训练,因此可能会产生有毒或令人反感的内容、不正确的信息或通常无用的答案。

模型使用案例:

LLaMA并没有被训练成一个聊天机器人。它所知道的只是预测序列中的下一个单词。Chat-GPT 也有很多隐藏的提示,只是你看不到它的例子。因此,如果你希望LLaMA的回答符合你的预期,请尝试首先给出问题和答案的示例。

 

如上图所示,除了较长且麻烦的引导之外,它对中文并不友好,如果你用中文来提问,那么你将会得到更加糟糕的结果。

如上图所示,如果不对模型进行引导,模型的回答会十分混乱,如果稍加引导,它是可以正确回复一些问题的,只是其仍然会生成一堆问题之外的胡言乱语(需要对此进行一些处理)。

LLaMA模型的意义:

LLaMA将在自然语言研究和潜在的高级应用领域发挥作用,比如“问题回答、自然语言理解或阅读理解,深入了解当前语言模型的能力和局限性”。

虽然最高端的LLaMA模型(有650亿个参数的LLaMA-65B)剑指来自DeepMind、谷歌和OpenAI这些AI竞争对手的类似产品,但可以说最值得关注的动向还是来自LLaMA-13B模型:如前所述,据称这种模型可以在单个GPU上运行,性能优于GPT-3。

与GPT-3衍生技术对数据中心的要求不同,LLaMA-13B为在不久的将来在消费级硬件上获得类似ChatGPT的性能打开了大门。

参数数量是AI中一个很重要的指标。参数是机器学习模型用来根据输入数据进行预测或分类的变量。语言模型中参数的数量是决定性能的关键因素,更大的模型通常能够处理更复杂的任务,并生成更一致的输出。然而更多的参数占用更多的空间,需要更多的计算资源来运行。因此,如果一个模型能在参数较少的情况下获得与另一个模型相同的结果,这表明它显著提升了效率。

独立AI研究人员Simon Willison在Mastodon的一个帖子中分析了Meta新AI模型具有的影响,他写道:“我现在认为,一两年内,我们可以在自己的(最先进)手机和笔记本电脑上运行拥有ChatGPT大部分功能的语言模型。”

LLaMA模型的下载与部署:

下载:

模型代码获取:

GitHub - facebookresearch/llama: Inference code for LLaMA models

模型预训练参数下载 :

LLaMA 开源语言模型7B 13B 30B 65B 泄漏版完整568GB国内网盘下载地址 免磁力链接 - openAI

部署:

配置模型超参数super_params.json文件,根据部署的模型大小进行配置:

修改example.py文件,使其适应读取.bin参数文件:

(1) 修改load函数:

def load(
    ckpt_dir: str,
    tokenizer_path: str,
    local_rank: int,
    world_size: int,
    max_seq_len: int,
    max_batch_size: int,
) -> LLaMA:
    start_time = time.time()
    print("Loading")
    # checkpoints = sorted(Path(ckpt_dir).glob("*.pth"))
    # assert world_size == len(
    #     checkpoints
    # ), f"Loading a checkpoint for MP={len(checkpoints)} but world size is {world_size}"
    # ckpt_path = checkpoints[local_rank]
    # print("Loading")
    # checkpoint = torch.load(ckpt_path, map_location="cpu")
# 加载超参数
    with open(Path(ckpt_dir) / "super_params.json", "r",encoding='utf-8') as f:
        super_params = json.loads(f.read().decode('utf-8'))
    model_args: ModelArgs = ModelArgs(
        max_seq_len=max_seq_len, max_batch_size=max_batch_size,**super_params
    )
    tokenizer = Tokenizer(model_path=tokenizer_path)
    model_args.vocab_size = tokenizer.n_words
    torch.set_default_tensor_type(torch.cuda.HalfTensor)
    model = Transformer(model_args)
    # print(model.layers)
    torch.set_default_tensor_type(torch.FloatTensor)

# 加载模型参数bin文件
    checkpoints = sorted(Path(ckpt_dir).glob("*.bin"))
    weights = {}
    for i in checkpoints:
        weights.update(torch.load(i))
    # 需要更改加载的bin文件参数所对应的各层的名字,使其与model中各层名字一一对应
    keys = [i for i in weights.keys()]
    for key in keys:
        if key.find('model.decoder.') != -1:
            keyNew = key.split('model.decoder.')[1]
            if keyNew.find('q_')>0:
                temp = keyNew.split('self_attn.q_proj')
                keyNew = temp[0] + 'attention.wq' + temp[1]
            elif keyNew.find('k_')>0:
                temp = keyNew.split('self_attn.k_proj')
                keyNew = temp[0] + 'attention.wk' + temp[1]
            elif keyNew.find('v_')>0:
                temp = keyNew.split('self_attn.v_proj')
                keyNew = temp[0] + 'attention.wv' + temp[1]
            elif keyNew.find('o_')>0:
                temp = keyNew.split('self_attn.o_proj')
                keyNew = temp[0] + 'attention.wo' + temp[1]
            elif keyNew.find('embed_tokens') != -1:
                keyNew = 'tok_embeddings.weight'
            weights.update({ keyNew: weights.pop(key)})
        elif key.find('lm_head.weight') != -1:
            weights.update({ 'output.weight': weights.pop(key)})
    model.load_state_dict(weights, strict=False)
    # print(model.state_dict())
    generator = LLaMA(model, tokenizer)
    print(f"Loaded in {time.time() - start_time:.2f} seconds")
    return generator

(2)  修改main函数中的接受的参数,给ckpt_dir、tokenizer_path一个默认值:

def main(
    ckpt_dir: str = '7b', # 模型参数所在目录
    tokenizer_path: str = '7b/tokenizer.model',
    temperature: float = 0.8,
    top_p: float = 0.95,
    max_seq_len: int = 512,
    max_batch_size: int = 32,
):

(3)在终端运行命令:

首次运行需要执行以下命令:

  1. pip install -r requirements.txt
  2. pip install -e .

启动模型:

torchrun example.py

Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐