简介:
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)在终端运行命令:
首次运行需要执行以下命令:
启动模型:
torchrun example.py
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在开发的Rails3网站的一些搜索功能上遇到了一个小问题。我有一个简单的Post模型,如下所示:classPost我正在使用acts_as_taggable_on来更轻松地向我的帖子添加标签。当我有一个标记为“rails”的帖子并执行以下操作时,一切正常:@posts=Post.tagged_with("rails")问题是,我还想搜索帖子的标题。当我有一篇标题为“Helloworld”并标记为“rails”的帖子时,我希望能够通过搜索“hello”或“rails”来找到这篇帖子。因此,我希望标题列的LIKE语句与acts_as_taggable_on提供的tagged_with方法
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案