HuggingFace镜像/Llama-3.2-1B-chatml
模型介绍文件和版本分析
下载使用量0

模型信息

Meta Llama 3.2 多语言大型语言模型(LLMs)系列包含 1B 和 3B 规模的预训练及指令微调生成式模型(文本输入/文本输出)。Llama 3.2 指令微调纯文本模型针对多语言对话场景进行了优化,包括智能体检索和摘要任务。在常见行业基准测试中,它们的性能优于许多现有的开源和闭源聊天模型。

模型开发者: Meta

模型架构: Llama 3.2 是一种自回归语言模型,采用优化的 transformer 架构。微调版本通过监督微调(SFT)和人类反馈强化学习(RLHF)来对齐人类对有用性和安全性的偏好。

训练数据参数规模输入模态输出模态上下文长度GQA共享嵌入token 数量知识截止日期
Llama 3.2(纯文本)新的公开可用在线数据混合体。1B(12.3 亿)多语言文本多语言文本和代码128k是是高达 9T tokens2023 年 12 月
3B(32.1 亿)多语言文本多语言文本和代码

支持语言: 官方支持英语、德语、法语、意大利语、葡萄牙语、印地语、西班牙语和泰语。Llama 3.2 的训练数据涵盖了比这 8 种支持语言更广泛的语言种类。开发者可以对 Llama 3.2 模型进行微调,以支持这些官方支持语言之外的其他语言,但需遵守 Llama 3.2 社区许可协议和可接受使用政策。开发者始终应确保其部署(包括涉及其他语言的部署)以安全和负责任的方式完成。

Llama 3.2 模型系列: token 数量仅指预训练数据。所有模型版本均使用分组查询注意力(GQA)以提高推理可扩展性。

模型发布日期: 2024 年 9 月 25 日

状态: 这是一个在离线数据集上训练的静态模型。未来可能会发布改进模型能力和安全性的版本。

许可协议: Llama 3.2 的使用受 Llama 3.2 社区许可协议(一项自定义的商业许可协议)约束。

反馈: 有关模型问题或意见的提交方式 有关如何提供模型反馈或意见的说明,请参见模型 README。有关生成参数的更多技术信息以及如何在应用程序中使用 Llama 3.2 的方法,请访问 此处。

预期用途

在 openmind 中的使用

import importlib.metadata
import os
import time
import argparse
import torch
import numpy as np
import logging
from packaging import version

def set_logging(model_name):
    log_filename = os.path.join(os.getcwd(), f"{model_name}_inference_{time.strftime('%Y%m%d_%H%M%S')}.log")
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
        handlers=[
            logging.FileHandler(log_filename),
            logging.StreamHandler(),
        ],
    )
def parse_args():
    parser = argparse.ArgumentParser(description="NPU Inference for Text Generation Model")
    parser.add_argument("-m", "--model_name_or_path", type=str, help="Path to model", default=".")
    parser.add_argument("-i", "--inference_mode", type=str, help="Inference mode ['pipeline', 'auto', 'gguf']", default="pipeline")
    parser.add_argument("--debug", action="store_true", help="Debug mode for transformers package", default=False)
    parser.add_argument("-g", "--gguf_file", type=str, help="GGUF file", default=None)
    parser.add_argument("-t", "--task_type", type=str, help="Pipeline task type", default="text-generation")
    parser.add_argument("-p", "--prompt_type", type=str, help="Prompt type ['chat', 'simple', 'translate']", default="chat")
    parser.add_argument("-c", "--custom_config", action="store_true", help="Use custom config", default=False)
    return parser.parse_args()

args = parse_args()
model_path = args.model_name_or_path
abs_model_path = os.path.abspath(model_path)
model_name = os.path.basename(abs_model_path)
set_logging(model_name)
if args.custom_config:
    os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
    logging.info("Set HF_ENDPOINT to 'https://hf-mirror.com' for download config file.")

if args.debug:
    logging.info("Debug mode enabled, using transformers package from source.")
    from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline, is_torch_npu_available
    if args.custom_config:
        from transformers import AutoConfig
        
else:
    logging.info("Debug mode disabled, using openmind package.")
    from openmind import AutoTokenizer, AutoModelForCausalLM, pipeline, is_torch_npu_available
    if args.custom_config:
        from openmind import AutoConfig

model_config = None
if args.custom_config:
    # 获取当前 Python 文件所在的文件夹路径
    file_dir = os.path.dirname(os.path.abspath(__file__))
    config_path = os.path.join(file_dir, 'config.json')
    if os.path.exists(config_path):
        logging.info(f"Custom config file: {config_path}")
        model_config = AutoConfig.from_pretrained(config_path)
    else:
        logging.warning("Custom config file not found, use default config.")

def load_model_from_gguf(model_path: str, device_map="auto", **kwargs):
    gguf_filename = args.gguf_file
    tokenizer = AutoTokenizer.from_pretrained(model_path, gguf_file=gguf_filename)
    tokenizer.pad_token = tokenizer.eos_token
    model = AutoModelForCausalLM.from_pretrained(model_path, gguf_file=gguf_filename, device_map=device_map)
    return tokenizer, model

def load_model_from_auto(model_path: str, device_map="auto", **kwargs):
    tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True, config=model_config)
    tokenizer.pad_token = tokenizer.eos_token
    model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device_map, trust_remote_code=True, config=model_config)
    return tokenizer, model

def load_model_from_pipeline(model_path: str, device_map="auto", task="text-generation", **kwargs):
    pipeline_pt = pipeline(
        task=task,
        model=model_path,
        device_map=device_map,
        framework="pt",
        truncation=True,
        trust_remote_code=True,
        config=model_config,
    )
    if not args.debug:
        # 判断openmind版本是否大于0.9.0
        if version.parse(importlib.metadata.version("openmind")) >= version.parse("0.9.0"):
            pipeline_pt = pipeline_pt.pipeline
    return pipeline_pt.tokenizer, pipeline_pt

def load_model(mode: str, *args, **kwargs):
    if mode == "gguf":
        return load_model_from_gguf(*args, **kwargs)
    elif mode == "auto":
        return load_model_from_auto(*args, **kwargs)
    elif mode == "pipeline":
        return load_model_from_pipeline(*args, **kwargs)
    else:
        raise ValueError(f"load_model Unknown mode: {mode}, should be one of ['gguf', 'auto', 'pipeline']")
    
def generate_text_form_model(tokenizer, model, prompt, max_new_tokens=50, **kwargs):
    inputs = tokenizer(prompt, return_tensors="pt", padding=True).to(model.device)
    output = model.generate(
        input_ids=inputs['input_ids'], 
        attention_mask=inputs['attention_mask'],
        max_new_tokens=max_new_tokens,
    )
    return tokenizer.decode(output[0], skip_special_tokens=True)

def generate_text_from_pipeline(tokenizer, pipeline, prompt, max_new_tokens=50, **kwargs):
    results = pipeline(
        prompt,
        max_new_tokens=max_new_tokens,
    )
    return results[0]["generated_text"]

def generate_text(mode: str, **kwargs):
    if mode == "auto" or mode == "gguf":
        model = kwargs.pop("model_or_pipeline")
        return generate_text_form_model(model=model, **kwargs)
    elif mode == "pipeline":
        pipeline = kwargs.pop("model_or_pipeline")
        return generate_text_from_pipeline(pipeline=pipeline, **kwargs)
    else:
        raise ValueError(f"generate_text Unknown mode: {mode}")

def apply_template(tokenizer, tokenize=False, prompt_type="chat"):
    if hasattr(tokenizer, 'chat_template'):
        if tokenizer.chat_template is None:
            logging.warning("Chat template is not defined, use default template.")
            tokenizer.chat_template = "{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"
        if prompt_type == "chat":
            chat = [
                {
                    "role": "system",
                    "content": "You are a helpful assistant who always responds in a friendly manner",
                },
                {
                    "role": "user",
                    "content": "Why does the ocean appear blue?",
                },
            ]
            chat_input = tokenizer.apply_chat_template(chat, tokenize=tokenize)
        elif prompt_type == "simple":
            chat = [
                {
                    "role": "user",
                    "content": "Why does the ocean appear blue?",
                },
            ]
            chat_input = tokenizer.apply_chat_template(chat, tokenize=tokenize)
        elif prompt_type == "translate":
            chat = [
                {
                    "role": "user",
                    "content": "Translate English to Chinese: Hello, how are you?",
                },
            ]
            chat_input = tokenizer.apply_chat_template(chat, tokenize=tokenize)
        else:
            logging.info(f"Unknown prompt type, use prompt type as input: {prompt_type}")
            chat_input = prompt_type
    else:
        chat_input = "Why does the ocean appear blue?"
    return chat_input

def main():
    model_path = args.model_name_or_path
    abs_model_path = os.path.abspath(model_path)
    model_name = os.path.basename(abs_model_path)
    logging.info(f"测试模型: {model_name}")
    logging.info(f"模型路径: {model_path}")
    logging.info(f"绝对路径: {abs_model_path}")
    inference_mode = args.inference_mode
    logging.info(f"推理模式: {inference_mode}")
    if args.gguf_file is not None:
        logging.info(f"GGUF文件: {args.gguf_file}")
    logging.info(f"任务模式: {args.task_type}")
    logging.info(f"文本类型: {args.prompt_type}")
    
    # 确保使用 NPU 设备
    device_map = "npu" if is_torch_npu_available() else "cpu"
    logging.info(f"NPU {'available' if device_map == 'npu' else 'not available'}, use device_map='{device_map}'.")

    # 加载模型
    tokenizer, model_or_pipeline = load_model(mode=inference_mode, model_path=model_path, device_map=device_map, task=args.task_type)
    prompt = apply_template(tokenizer, tokenize=False, prompt_type=args.prompt_type)

    # 推理性能测试
    inference_times = []
    num_runs = 10

    logging.info(f"\n=== NPU {model_name} 性能测试 ===")

    for i in range(num_runs):
        input_text = prompt

        start_time = time.time()
        
        results = generate_text(mode=inference_mode, tokenizer=tokenizer, model_or_pipeline=model_or_pipeline, prompt=input_text)
        if device_map in ["npu", "auto"]:
            torch.npu.synchronize()
        else:
            pass

        inference_time = time.time() - start_time
        inference_times.append(inference_time)

        if i == 0:
            logging.info(f"输入文本: {input_text}")
            logging.info("生成结果:")
            logging.info(f"{results}")

    avg_time = np.mean(inference_times)
    std_time = np.std(inference_times)

    logging.info("\n性能分析:")
    logging.info(f"NPU平均推理时间: {avg_time:.4f} 秒")
    logging.info(f"NPU推理时间标准差: {std_time:.4f} 秒")
    logging.info(f"推理时间列表: {inference_times}")


if __name__ == "__main__":
    main()

预期使用场景: Llama 3.2 旨在用于多种语言的商业和研究用途。仅文本指令微调模型适用于类助手聊天和智能体应用,例如知识检索与总结、移动 AI 写作助手以及查询和提示词重写。预训练模型可适配各种额外的自然语言生成任务。

超出范围: 以任何违反适用法律法规(包括贸易合规法律)的方式使用。以任何其他被《可接受使用政策》和《Llama 3.2 社区许可协议》禁止的方式使用。在本模型卡片中明确提及为支持语言之外的其他语言中使用。

使用方法

本仓库包含 Llama-3.2-1B 的两个版本,分别用于 transformers 和原始 llama 代码库。

与 transformers 一起使用

从 transformers >= 4.43.0 版本开始,您可以使用 Transformers 流水线抽象或通过利用 Auto 类和 generate() 函数来运行对话推理。

确保通过 pip install --upgrade transformers 命令更新您的 transformers 安装。

import torch
from transformers import pipeline

model_id = "meta-llama/Llama-3.2-1B"

pipe = pipeline(
    "text-generation", 
    model=model_id, 
    torch_dtype=torch.bfloat16, 
    device_map="auto"
)

pipe("The key to life is")

与 llama 配合使用

请按照 仓库 中的说明操作。

如需下载原始检查点,请参考以下使用 huggingface-cli 的示例命令:

huggingface-cli download meta-llama/Llama-3.2-1B --include "original/*" --local-dir Llama-3.2-1B

硬件与软件

训练要素:我们使用了自定义训练库、Meta 定制的 GPU 集群以及生产基础设施进行预训练。微调、标注和评估也在生产基础设施上完成。

训练能源消耗:根据下表,训练在 H100-80GB(TDP 为 700W)类型硬件上累计使用了 91.6 万 GPU 小时的计算量。训练时间是训练每个模型所需的总 GPU 时间,功耗是每台 GPU 设备的峰值功率容量,并已根据能源使用效率进行调整。

训练温室气体排放:训练产生的基于位置的温室气体排放总量估计为 240 吨二氧化碳当量。自 2020 年起,Meta 已在其全球运营中实现温室气体净零排放,并 100% 使用可再生能源匹配其电力消耗;因此,训练产生的基于市场的温室气体排放总量为 0 吨二氧化碳当量。

训练时间(GPU 小时)对数生成时间(GPU 小时)训练功耗(W)训练基于位置的温室气体排放(吨二氧化碳当量)训练基于市场的温室气体排放(吨二氧化碳当量)
Llama 3.2 1B37 万-7001070
Llama 3.2 3B46 万-7001330
总计83 万8.6 万2400

用于确定训练能源使用和温室气体排放的方法可参见此处。由于 Meta 公开发布了这些模型,其他人将不会产生相关的训练能源消耗和温室气体排放。

训练数据

概述:Llama 3.2 是在高达 9 万亿个来自公开可用来源的 tokens 上进行预训练的。对于 1B 和 3B 的 Llama 3.2 模型,我们在模型开发的预训练阶段融入了来自 Llama 3.1 8B 和 70B 模型的 logits,其中这些更大模型的输出(logits)被用作 token 级别的目标。在剪枝后,我们使用知识蒸馏来恢复性能。在训练后阶段,我们采用了与 Llama 3.1 类似的方案,并通过在预训练模型之上进行多轮对齐来生成最终的聊天模型。每一轮都包括监督微调(SFT)、拒绝采样(RS)和直接偏好优化(DPO)。

数据时效性:预训练数据的截止日期为 2023 年 12 月。

基准测试 - 英文文本

在本节中,我们报告了 Llama 3.2 模型在标准自动基准测试中的结果。所有这些评估均使用我们的内部评估库进行。

基础预训练模型

类别基准测试样本数指标Llama 3.2 1BLlama 3.2 3BLlama 3.1 8B
通用MMLU5macro_avg/acc_char32.25866.7
AGIEval English3-5average/acc_char23.339.247.8
ARC-Challenge25acc_char32.869.179.7
阅读理解SQuAD1em49.267.777
QuAC (F1)1f137.942.944.9
DROP (F1)3f128.045.259.5
长文本Needle in Haystack0em96.811

指令微调模型

能力基准测试样本数指标Llama 3.2 1BLlama 3.2 3BLlama 3.1 8B
通用MMLU5macro_avg/acc49.363.469.4
改写Open-rewrite eval0micro_avg/rougeL41.640.140.9
摘要TLDR9+ (test)1rougeL16.819.017.2
指令遵循IFEval0avg(prompt/instruction acc loose/strict)59.577.480.4
数学GSM8K (CoT)8em_maj1@144.477.784.5
MATH (CoT)0final_em30.647.351.9
推理ARC-C0acc59.478.683.4
GPQA0acc27.232.832.8
Hellaswag0acc41.269.878.7
工具使用BFCL V20acc25.767.070.9
Nexus0macro_avg/acc13.534.338.5
长文本InfiniteBench/En.QA0longbook_qa/f120.319.827.3
InfiniteBench/En.MC0longbook_choice/acc38.063.372.2
NIH/Multi-needle0recall75.084.798.8
多语言MGSM (CoT)0em24.558.268.9

多语言基准测试

类别基准测试语言Llama 3.2 1BLlama 3.2 3BLlama 3.1 8B
通用MMLU(5-shot,macro_avg/acc)葡萄牙语39.8254.4862.12
西班牙语41.555.162.5
意大利语39.853.861.6
德语39.253.360.6
法语40.554.662.3
印地语33.543.350.9
泰语34.744.550.3

责任与安全

作为我们负责任发布方法的一部分,我们采用了三管齐下的策略来管理信任与安全风险:

  1. 使开发人员能够为其目标受众和Llama支持的用例部署有帮助、安全且灵活的体验
  2. 保护开发人员免受旨在利用Llama功能潜在造成伤害的恶意用户的侵害
  3. 为社区提供保护,帮助防止我们模型的滥用

负责任部署

方法:Llama是一项基础技术,旨在用于各种用例。Meta的Llama模型如何被负责任地部署的示例可在我们的社区故事网页中找到。我们的方法是构建最有帮助的模型,通过为通用用例调整模型安全性并解决一系列标准危害,使世界能够从技术力量中受益。然后,开发人员可以自主决定为其用例定制安全性,定义自己的政策,并在其Llama系统中部署必要的安全措施。Llama 3.2的开发遵循了我们负责任使用指南中概述的最佳实践。

Llama 3.2 指令型

目标:我们进行安全微调的主要目标是为研究社区提供宝贵资源,用于研究安全微调的稳健性,并为开发人员提供一个现成、安全且强大的模型,以减少部署安全AI系统的开发工作量。我们实施了与Llama 3相同的安全缓解措施,您可以在Llama 3论文中了解更多相关信息。

微调数据:我们采用多方面的数据收集方法,将供应商提供的人工生成数据与合成数据相结合,以减轻潜在的安全风险。我们开发了许多基于大型语言模型(LLM)的分类器,使我们能够审慎选择高质量的提示和响应,从而加强数据质量控制。

拒绝与语气:在Llama 3的基础上,我们非常重视模型对良性提示的拒绝以及拒绝语气。我们在安全数据策略中纳入了边界和对抗性提示,并修改了安全数据响应以遵循语气指南。

Llama 3.2 系统

安全即系统:包括Llama 3.2在内的大型语言模型并非设计为孤立部署,而是应作为整体AI系统的一部分进行部署,并根据需要配备额外的安全防护措施。开发人员在构建智能体系统时,应部署系统安全防护措施。安全防护措施是实现适当的有用性-安全性平衡以及减轻系统固有的安全和安保风险,以及模型或系统与外部工具集成所带来的风险的关键。作为我们负责任发布方法的一部分,我们为社区提供了安全防护措施,开发人员在部署Llama模型或其他LLM时应使用这些措施,包括Llama Guard、Prompt Guard和Code Shield。我们所有的参考实现演示默认都包含这些安全防护措施,因此开发人员可以开箱即用地受益于系统级安全。

新增功能与使用场景

技术进步:Llama 的发布通常会引入新功能,除了适用于所有生成式 AI 用例的最佳实践外,还需要特别考虑这些新功能。对于 Llama 3.2 同样支持的先前版本功能,请参阅 Llama 3.1 模型卡片,因为此处适用相同的注意事项。

受限环境:Llama 3.2 1B 和 3B 模型预计将部署在高度受限的环境中,例如移动设备。使用较小模型的 LLM 系统与更复杂、更大的系统相比,将具有不同的对齐概况以及安全性/有用性权衡。开发人员应确保其系统的安全性满足其使用场景的要求。我们建议为此类使用场景采用更轻量级的系统安全防护措施,例如 Llama Guard 3-1B 或其移动优化版本。

评估

规模化评估:我们构建了专门的对抗性评估数据集,并对由 Llama 模型和 Purple Llama 安全防护措施组成的系统进行了评估,以过滤输入提示和输出响应。在实际场景中评估应用程序非常重要,我们建议为您的使用场景构建专门的评估数据集。

红队测试:我们开展了定期的红队测试,旨在通过对抗性提示发现风险,并利用这些经验改进我们的基准和安全调优数据集。我们与关键风险领域的主题专家早早合作,以了解这些现实世界危害的性质,以及此类模型可能如何对社会造成意外伤害。基于这些对话,我们为红队制定了一系列试图达成的对抗性目标,例如提取有害信息或对模型进行重新编程以使其以潜在有害的方式运行。红队由网络安全、对抗性机器学习、负责任 AI 和诚信方面的专家组成,此外还有在特定地理市场具有诚信问题背景的多语言内容专家。

关键风险

除上述安全工作外,我们还特别注意衡量和/或缓解以下关键风险领域:

1. CBRNE(化学、生物、放射、核及爆炸物武器):Llama 3.2 1B 和 3B 模型是 Llama 3.1 的更小、能力更弱的衍生模型。对于 Llama 3.1 70B 和 405B,为评估化学和生物武器扩散相关风险,我们进行了提升测试,旨在评估使用 Llama 3.1 模型是否会显著增强恶意行为者规划或实施此类武器攻击的能力,并确定此类测试同样适用于更小的 1B 和 3B 模型。

2. 儿童安全:儿童安全风险评估由专家团队开展,以评估模型生成可能导致儿童安全风险输出的能力,并通过微调确定任何必要且适当的风险缓解措施。我们利用这些专家红队演练,通过 Llama 3 模型开发扩展了评估基准的覆盖范围。对于 Llama 3,我们使用基于目标的方法进行了新的深入会话,以沿着多个攻击向量评估模型风险,包括 Llama 3 所训练的其他语言。我们还与内容专家合作进行红队演练,评估潜在违规内容,同时考虑市场特定的细微差别或经验。

3. 网络攻击:对于 Llama 3.1 405B,我们的网络攻击提升研究调查了 LLM 是否能在技能水平和速度方面增强人类的黑客任务能力。 我们的攻击自动化研究侧重于评估 LLM 作为自主代理在网络攻击行动中的能力,特别是在勒索软件攻击的背景下。此评估与之前将 LLM 视为交互式助手的研究不同。主要目标是评估这些模型是否能在没有人类干预的情况下有效作为独立代理执行复杂的网络攻击。由于 Llama 3.2 的 1B 和 3B 模型比 Llama 3.1 405B 更小、能力更弱,我们普遍认为为 405B 模型进行的测试同样适用于 Llama 3.2 模型。

社区合作

行业伙伴关系:生成式AI安全需要专业知识和工具支持,我们相信开放社区的力量能够加速这一领域的发展。我们积极参与AI Alliance、Partnership on AI和MLCommons等开放联盟,为安全标准化和透明度建设贡献力量。我们鼓励社区采用MLCommons概念验证评估等分类体系,以促进安全和内容评估方面的协作与透明。我们的Purple Llama工具已开源供社区使用,并通过云服务提供商等生态系统合作伙伴广泛分发。欢迎社区通过我们的Github仓库贡献力量。

资助计划:我们还设立了Llama Impact Grants项目,旨在发掘并支持将Meta的Llama模型应用于社会公益的杰出案例,涵盖教育、气候和开放创新三大领域。从数百份申请中脱颖而出的20名决赛者名单可在此处查看。

反馈机制:最后,我们提供了一系列资源,包括输出报告机制和漏洞奖励计划,旨在借助社区力量持续改进Llama技术。

伦理考量与局限性

核心价值观:Llama 3.2的核心价值观是开放、包容与实用。它旨在服务所有人,并适用于广泛的使用场景。因此,其设计注重可访问性,面向不同背景、经历和观点的人群。Llama 3.2以用户的实际需求为出发点,避免插入不必要的评判或规范性内容,同时认识到某些在特定情况下可能看似有问题的内容,在其他场景中可能具有重要价值。它尊重所有用户的尊严和自主权,尤其重视推动创新与进步的自由思想和表达价值。

测试说明:Llama 3.2是一项新技术,与任何新技术一样,其使用存在一定风险。迄今为止的测试尚未涵盖,也不可能涵盖所有场景。因此,与所有大型语言模型(LLM)一样,无法预先预测Llama 3.2的所有潜在输出,在某些情况下,模型可能会对用户提示产生不准确、有偏见或其他令人不适的响应。因此,在部署基于Llama 3.2模型的任何应用之前,开发者应针对其特定应用场景进行定制化的安全测试和调优。请参考我们的负责任使用指南、信任与安全解决方案以及其他资源,了解更多负责任开发的相关信息。