华为openPangu-2.0-Pro MoE大模型:工业级部署与高性价比实践指南

发布时间:2026/9/4 5:18:41
华为openPangu-2.0-Pro MoE大模型:工业级部署与高性价比实践指南 如果你最近关注大模型可能会发现一个现象闭源模型如GPT-4、Claude 3和开源模型如Llama、Qwen之间的差距似乎正在从“能力”的差距转变为“成本”和“可控性”的差距。对于大多数企业和开发者而言动辄千亿参数、需要庞大算力集群的顶级开源模型依然遥不可及。我们真正需要的或许不是一个在榜单上刷分最高的模型而是一个在合理成本下能力足够强、且完全可控的工业级解决方案。这就是华为最新开源的openPangu-2.0-Pro模型及其技术报告值得深入关注的原因。它不是一个追逐参数规模的“刷榜”模型而是一个明确指向“实用化”和“工业化部署”的505B参数混合专家MoE模型。本文将为你深入拆解 openPangu-2.0-Pro。我不会只复述技术报告里的参数和指标而是会聚焦于三个更实际的问题它到底解决了什么痛点相比动辄万亿参数的“巨无霸”505B的MoE模型在成本、效果和部署难度上做了怎样的权衡技术报告里没明说但至关重要的“工程细节”是什么比如它的激活参数策略、路由机制在实际推理中意味着什么作为一个开发者或企业技术负责人我该如何评估、测试甚至使用它从环境准备、模型获取到推理验证有哪些实际的步骤和潜在的“坑”这篇文章的目标是让你在读完後不仅能了解openPangu-2.0-Pro的技术全貌更能清晰地判断它是否适合你的项目并掌握上手实践的第一手路径。1. openPangu-2.0-Pro为什么是现在为什么是它在讨论具体技术之前我们需要先理解模型开源领域的“战场”变化。过去一年开源社区的焦点从“有没有”转向了“好不好用”。Meta的Llama系列定义了开源基座模型的标杆但动辄700B的参数规模对推理硬件和成本提出了极高要求。许多团队发现即使拿到了模型权重部署和优化依然是拦路虎。华为此次开源openPangu-2.0-Pro可以看作是对当前市场痛点的一次精准回应。它的核心价值主张非常清晰在保证接近顶级模型能力的前提下大幅降低实际部署和推理的成本与复杂度。关键判断一MoE架构是成本与效果平衡的关键。openPangu-2.0-Pro采用了混合专家Mixture of Experts, MoE架构。简单来说它不是一个拥有5050亿个参数都需要被激活的“稠密”模型而是由多个“专家”子网络组成。每次处理输入时一个轻量级的“路由网络”只会选择激活其中一小部分专家例如2个。这意味着实际激活参数远小于总参数虽然总参数量高达505B但每次推理实际计算的参数可能只有几十B或一百多B。这直接转化为更快的推理速度和更低的显存占用。效果不降反升每个专家可以在不同领域或任务上“专业化”模型整体知识容量巨大通过路由机制灵活组合能在复杂任务上表现出色。关键判断二这是一份“工业级”而非“学术级”的技术报告。仔细阅读其技术报告你会发现它没有过多纠结于在某个特定榜单上提升零点几个百分点而是详细阐述了训练稳定性、扩展效率、推理优化等工程实践问题。这暗示了华为内部已经将其用于实际业务场景并积累了可复现的规模化训练和部署经验。对于企业用户来说这种经过实践检验的工程细节往往比单纯的性能指标更有价值。那么谁最应该关注openPangu-2.0-Pro有私有化部署需求的企业对数据安全敏感需要将大模型能力部署在自有服务器或云环境。成本敏感的中大型项目需要强大的模型能力但无法承担闭源API的长期调用费用或千亿级稠密模型的本地部署成本。希望进行深度定制和优化的AI工程师开源模型提供了从底层修改架构、微调、知识蒸馏的可能性。研究MoE架构和规模化训练的研究者其技术报告是宝贵的工程实践参考。2. 核心概念与架构深度解读在深入实操之前我们必须先厘清几个核心概念否则很容易被“505B”、“MoE”这些术语搞晕。2.1 混合专家模型不是“一个”大模型而是“一群”专家委员会你可以把传统的稠密模型如GPT-3想象成一位无所不知但反应稍慢的“全能教授”。无论你问什么领域的问题编程、文学、物理都需要动用他的全部“脑细胞”所有参数来思考。而MoE模型则像一个“专家委员会”。委员会里有成千上万名各领域的顶级专家总参数量很大但每次开会处理你的问题时只根据议题你的输入邀请最相关的2-3位专家激活少数专家网络来发言。这样会议效率极高推理快且讨论质量很高专家足够专业。在openPangu-2.0-Pro中总参数量 (Total Parameters)505B (5050亿)。这是所有“专家”的参数总和代表了模型的知识容量上限。激活参数量 (Activated Parameters)每次推理实际参与计算的参数数量可能只有总参数的10%-20%约50B-100B。这是影响推理速度和显存占用的关键。专家数 (Number of Experts)与激活专家数 (Top-k Experts)模型包含大量专家子网络例如64个、128个每个输入通过路由网络只选择激活其中k个通常是2个。这就是“稀疏激活”的精髓。2.2 路由机制如何聪明地选择专家路由机制是MoE模型的“大脑”。一个糟糕的路由器会导致某些专家负载过重负载不均衡而其他专家闲置严重影响效率。openPangu-2.0-Pro的技术报告很可能重点优化了路由策略。常见的路由机制包括基于门控网络的路由一个可学习的神经网络根据输入计算每个专家的权重选择权重最高的k个。负载均衡损失在训练时引入额外的损失函数惩罚那些总是被选择或总不被选择的专家促使负载更均匀。对开发者的实际影响路由机制决定了模型在处理你的特定任务时会调用哪些“知识模块”。理解这一点有助于后续的微调——如果你主要做代码生成你可能会希望微调路由网络让它更倾向于激活编程相关的专家。2.3 与同类模型的对比为了更直观地定位openPangu-2.0-Pro我们可以做一个简单对比特性openPangu-2.0-Pro (505B MoE)Llama 3 70B (稠密)GPT-4 (传闻为MoE)架构稀疏激活的混合专家模型稠密Transformer推测为超大规模MoE总参数量505B70B未知传闻万亿级激活参数量~50B-100B (估计)70B (全部)未知主要优势高性价比知识容量大推理成本相对低生态完善社区工具多中等规模性能强综合能力最强生态成熟主要劣势社区生态初建部署调优需更多工程同等能力下推理成本高于MoE模型闭源成本高数据不可控适合场景企业私有化部署、成本敏感的高能力需求、MoE研究快速原型验证、中等规模应用、依赖社区生态追求极致效果、无私有化需求、预算充足这个对比清晰地表明openPangu-2.0-Pro试图在“庞大闭源MoE”和“中等规模开源稠密模型”之间开辟一个高性价比的“开源工业级MoE”市场。3. 环境准备如何获取并搭建推理环境假设你已经决定要尝试这个模型。第一步不是直接下载500GB的权重文件而是做好环境规划和准备。3.1 硬件要求评估这是最重要的前置条件。MoE模型虽然稀疏激活但其巨大的总参数量在加载模型权重时对显存仍有很高要求。最低要求可能仅支持量化版推理GPU显存至少80GB。这很可能只能运行INT8或FP16量化的版本。例如使用两张NVIDIA A100 (40GB) 或 RTX 6000 Ada (48GB)。CPU与内存64核以上CPU512GB以上系统内存用于辅助加载和交换。存储至少1TB的高速NVMe SSD用于存放模型权重和临时文件。推荐配置用于全参数或更高质量量化推理GPU显存160GB以上。例如两张NVIDIA H100 (80GB) 或四张A100 (40GB)。这是为了能更流畅地加载FP16精度的模型。CPU与内存128核CPU1TB以上系统内存。存储2TB以上NVMe SSD。关键提醒务必先查看官方发布的模型文件列表确认不同精度BF16, FP16, INT8, INT4权重文件的大小再决定你的硬件方案。INT4量化版的体积可能只有原始版本的1/4是降低部署门槛的关键。3.2 软件与依赖环境模型推理通常基于PyTorch或DeepSpeed。华为可能会提供基于其自有框架如MindSpore的版本但为最大化兼容性PyTorch生态仍是首选。# 创建一个新的Python虚拟环境强烈推荐 conda create -n openpangu python3.10 conda activate openpangu # 安装PyTorch请根据你的CUDA版本到官网获取对应命令 # 例如对于CUDA 12.1 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 # 安装常用的推理与加速库 pip install transformers accelerate sentencepiece protobuf # 如果使用FlashAttention等优化 pip install flash-attn --no-build-isolation # 如果计划使用vLLM等高性能推理引擎 pip install vLLM3.3 获取模型权重模型预计会开源在华为云ModelArts或Hugging Face Hub上。# 方式一使用Hugging Face Hub如果提供 # 需要先登录 huggingface-cli login from huggingface_hub import snapshot_download snapshot_download(repo_idhuawei/openPangu-2.0-Pro, local_dir./openPangu-2.0-Pro) # 方式二使用官方提供的直接下载链接更可能的方式 # 通常是一个包含多个分片权重文件和配置文件的压缩包或文件列表 # 你需要使用wget或curl按列表下载 # 示例链接需替换为官方实际链接 wget -c https://model-assets.huawei.com/openpangu/2.0-pro/pytorch_model-00001-of-00010.bin wget -c https://model-assets.huawei.com/openpangu/2.0-pro/config.json # ... 下载所有分片下载注意事项完整性校验下载后务必使用官方提供的MD5或SHA256校验和检查文件完整性。网络环境模型文件巨大确保网络稳定建议使用具备断点续传功能的工具。存储格式确认权重是PyTorch的.bin格式还是SafeTensors格式后者加载更安全更快。4. 使用Transformers库进行基础推理这是最通用、最快速的验证模型是否成功加载并运行的方式。我们假设你已经将模型权重下载到了./openPangu-2.0-Pro目录。4.1 加载模型与分词器# 文件路径basic_inference.py import torch from transformers import AutoTokenizer, AutoModelForCausalLM # 指定模型本地路径 model_path ./openPangu-2.0-Pro # 加载分词器 print(Loading tokenizer...) tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) # MoE模型通常需要trust_remote_code # 加载模型 print(Loading model...) # 使用device_mapauto让accelerate自动分配模型层到多GPU # 使用torch.bfloat16节省显存并保持数值稳定性 model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, # 使用BF16精度 device_mapauto, # 自动多GPU分布 trust_remote_codeTrue, # 必须因为可能是自定义架构 # 对于MoE模型可能还需要以下参数 # moe_load_balancing_loss_weight0.01, # 示例具体参数名需参考官方文档 # use_cacheTrue, # 启用KV缓存加速生成 ) print(Model and tokenizer loaded successfully.) # 将模型设置为评估模式 model.eval()关键参数解释trust_remote_codeTrue对于非Hugging Face官方原生支持的架构如自定义的MoE实现必须启用此选项。请务必从可信来源下载模型因为这会执行仓库中的代码。torch_dtypetorch.bfloat16BF16精度在保持数值范围的同时减少了内存占用是当前大模型推理的推荐精度。device_map“auto”由accelerate库自动将模型的不同层拆分到可用的多个GPU上这是单机多卡加载超大模型的标配。4.2 编写推理函数def generate_text(prompt, max_new_tokens256, temperature0.7, top_p0.9): 使用模型生成文本。 参数: prompt: 输入的提示文本。 max_new_tokens: 最大生成token数量。 temperature: 温度参数控制随机性越低越确定越高越随机。 top_p: 核采样参数控制生成多样性。 # 编码输入 inputs tokenizer(prompt, return_tensorspt).to(model.device) # 生成配置 generate_kwargs { max_new_tokens: max_new_tokens, temperature: temperature, top_p: top_p, do_sample: True, # 启用采样 pad_token_id: tokenizer.eos_token_id, # 设置填充token } # 执行生成禁用梯度计算以节省内存 with torch.no_grad(): outputs model.generate(**inputs, **generate_kwargs) # 解码输出跳过输入的prompt部分 generated_tokens outputs[0][inputs[input_ids].shape[1]:] generated_text tokenizer.decode(generated_tokens, skip_special_tokensTrue) return generated_text.strip() # 测试推理 if __name__ __main__: test_prompt 请用Python写一个快速排序函数并添加详细注释。 print(f输入: {test_prompt}\n) print(生成中...) result generate_text(test_prompt, max_new_tokens512) print(f输出:\n{result}\n) print(- * 50)4.3 运行与验证在终端运行你的脚本python basic_inference.py预期成功现象控制台会依次输出“Loading tokenizer...”、“Loading model...”这个过程可能会持续几分钟因为要从磁盘加载数百GB的权重。加载完成后会打印“Model and tokenizer loaded successfully.”。开始生成文本你会看到模型输出的代码和注释。如果遇到问题首先检查显存不足 (CUDA out of memory)尝试使用更低精度的权重如INT8或使用device_map“cpu”先加载到内存再使用.to(‘cuda:0’)手动管理层加载。更根本的方法是升级硬件或使用模型并行。未知模型架构错误确保transformers库版本较新并且官方提供了对应的模型类定义在config.json的architectures字段中指明。分词器错误确认tokenizer文件已正确下载trust_remote_codeTrue已设置。5. 进阶使用vLLM进行高性能推理对于生产环境或需要高并发、低延迟的场景使用原始的transformers库进行推理效率不高。vLLM是一个专为LLM推理设计的高性能引擎对注意力机制和KV缓存做了极致优化并且原生支持MoE模型。5.1 安装与启动vLLM# 确保已安装vLLM pip install vLLM5.2 编写vLLM推理脚本# 文件路径vllm_inference.py from vllm import LLM, SamplingParams import time # 定义采样参数 sampling_params SamplingParams( temperature0.8, top_p0.95, max_tokens1024, ) # 初始化LLM引擎 # tensor_parallel_size 指定张量并行度需等于GPU数量 print(Initializing vLLM engine...) llm LLM( model./openPangu-2.0-Pro, # 模型本地路径 tokenizer./openPangu-2.0-Pro, tensor_parallel_size2, # 假设使用2张GPU dtypebfloat16, # 精度 trust_remote_codeTrue, # vLLM针对MoE有特定优化参数如 # max_num_selected_experts2, # 每个token激活的专家数需与模型配置一致 # moe_expert_parallel_size1, # 专家并行度 ) print(Engine ready.) # 准备批处理提示 prompts [ 解释一下量子计算的基本原理。, 写一封感谢客户购买产品的商务邮件。, 将以下句子翻译成英文今天天气真好我们一起去公园散步吧。, ] # 批量生成 print(fGenerating responses for {len(prompts)} prompts...) start_time time.time() outputs llm.generate(prompts, sampling_params) end_time time.time() # 输出结果 for i, output in enumerate(outputs): prompt prompts[i] generated_text output.outputs[0].text print(f[Prompt {i1}]: {prompt}) print(f[Response {i1}]:\n{generated_text}\n) print(fGenerated {len(output.outputs[0].token_ids)} tokens.) print(- * 60) print(fTotal generation time: {end_time - start_time:.2f} seconds.)vLLM的核心优势PagedAttention高效管理KV缓存极大减少内存碎片允许更长的序列和更高的批处理大小。连续批处理动态将不同长度的请求组合成批提高GPU利用率。对MoE的高效支持优化了专家间的通信和计算调度。5.3 启动API服务器生产环境推荐vLLM可以轻松启动一个兼容OpenAI API协议的服务器方便集成。# 启动API服务器 python -m vllm.entrypoints.openai.api_server \ --model ./openPangu-2.0-Pro \ --tokenizer ./openPangu-2.0-Pro \ --tensor-parallel-size 2 \ --served-model-name openpangu-2.0-pro \ --trust-remote-code \ --port 8000启动后你就可以通过标准的OpenAI API客户端调用它curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -d { model: openpangu-2.0-pro, prompt: 深圳的市花是什么, max_tokens: 100, temperature: 0 }6. 模型微调实战指南开源模型最大的优势之一是支持微调。对于openPangu-2.0-Pro这样的MoE模型微调策略需要特别设计。6.1 微调策略选择全参数微调更新所有505B参数。不现实需要巨大的算力几乎只有原厂能做。LoRA (Low-Rank Adaptation)在模型原有权重旁注入低秩适配器只训练这些新增的小参数。这是最推荐的方法能极大节省显存和计算量。专家特定微调只微调路由网络和少数与目标任务最相关的专家。这需要对模型结构有更深理解但可能效率更高。仅微调路由网络固定所有专家权重只训练路由网络让它学会为你的任务选择更合适的专家。这是最轻量级的微调方式。6.2 使用PEFT和Transformers进行LoRA微调以下是使用Hugging Facepeft库进行LoRA微调的示例框架。# 文件路径lora_finetune.py import torch from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model, TaskType from datasets import load_dataset import bitsandbytes as bnb # 用于8位优化器 # 1. 加载模型和分词器以低精度加载节省内存 model_path ./openPangu-2.0-Pro tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_path, load_in_8bitTrue, # 使用LLM.int8()量化加载极大减少内存 device_mapauto, trust_remote_codeTrue, ) tokenizer.pad_token tokenizer.eos_token # 设置填充token # 2. 准备LoRA配置 lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, # 因果语言模型任务 r8, # LoRA的秩rank越小参数量越少 lora_alpha32, # 缩放参数 lora_dropout0.1, target_modules[q_proj, v_proj, k_proj, o_proj, gate_proj, up_proj, down_proj], # 针对Transformer的模块 # 对于MoE模型可能还需要针对路由门控网络‘gate’或‘router’进行配置 # target_modules[gate, router, q_proj, ...] biasnone, ) # 3. 将原模型转换为PEFT模型仅LoRA参数可训练 model get_peft_model(model, lora_config) model.print_trainable_parameters() # 打印可训练参数量应该只占原模型的1% # 4. 准备数据集示例使用指令微调格式 def format_instruction(example): # 假设数据集有‘instruction’和‘output’字段 text f### Instruction:\n{example[instruction]}\n\n### Response:\n{example[output]} return {text: text} dataset load_dataset(your_dataset_name, splittrain) dataset dataset.map(format_instruction) # 5. 数据预处理tokenization def tokenize_function(examples): return tokenizer(examples[text], truncationTrue, paddingmax_length, max_length512) tokenized_dataset dataset.map(tokenize_function, batchedTrue) # 6. 定义训练参数 training_args TrainingArguments( output_dir./openpangu-lora-checkpoints, num_train_epochs3, per_device_train_batch_size1, # MoE模型批大小通常很小甚至为1 gradient_accumulation_steps8, # 通过梯度累积模拟更大批次 learning_rate2e-4, fp16True, # 使用混合精度训练 logging_steps10, save_steps500, save_total_limit2, remove_unused_columnsFalse, push_to_hubFalse, # 可设置为True上传到Hugging Face Hub ) # 7. 创建Trainer并开始训练 trainer Trainer( modelmodel, argstraining_args, train_datasettokenized_dataset, data_collatorDataCollatorForLanguageModeling(tokenizertokenizer, mlmFalse), ) trainer.train()微调关键点8bit加载load_in_8bitTrue是微调超大模型的必备技术来自bitsandbytes库。梯度累积由于模型太大单卡批大小可能只能设为1通过梯度累积gradient_accumulation_steps来稳定训练。目标模块选择对于MoE模型除了标准的注意力Q, K, V, O和FFN投影层路由门控网络gate/router往往是微调的关键确保将其加入target_modules。7. 常见问题与排查思路在部署和运行openPangu-2.0-Pro的过程中你几乎一定会遇到一些问题。下表整理了常见问题及解决方法。问题现象可能原因排查方式解决方案加载模型时OOM (Out of Memory)1. GPU显存不足。2. 加载了过高精度的权重如BF16/FP16。3. 未使用device_map“auto”进行多卡分布。1. 使用nvidia-smi查看显存占用。2. 检查加载的torch_dtype。1. 使用量化版本INT8/INT4。2. 使用accelerate的device_map“cpu”或“disk”进行离线加载。3. 增加GPU数量。RuntimeError: CUDA error: no kernel image is available for executionGPU算力Architecture与编译的PyTorch/CUDA版本不匹配。常见于较新的GPU如H100。检查GPU型号和PyTorch官方支持的CUDA算力版本。从源码编译PyTorch以支持特定算力或使用预编译的支持更高算力的版本。KeyError: ‘gate’或未知属性错误Transformers库版本过旧或不支持该MoE实现。trust_remote_code未正确工作。1. 升级transformers,accelerate。2. 检查模型目录下是否有modeling_xxx.py文件。1. 使用最新的库版本。2. 确保从官方指定仓库下载完整代码和权重。3. 仔细阅读官方README的依赖说明。推理速度非常慢1. 未使用KV缓存 (use_cacheFalse)。2. 未启用FlashAttention等优化。3. CPU内存不足导致频繁交换。1. 检查生成配置。2. 监控GPU利用率和CPU内存使用率。1. 确保model.generate()时use_cacheTrue。2. 安装flash-attn并确保模型配置支持。3.切换到vLLM引擎这是提升推理速度最有效的方法。生成结果质量差、胡言乱语1. 温度 (temperature) 参数过高。2. 提示词格式不符合模型训练时的格式。3. 模型权重下载不完整或损坏。1. 调整生成参数temperature0.1~0.7。2. 查阅技术报告模仿其提示词格式。3. 校验模型文件哈希值。1. 使用更确定的参数低temperature高top_p。2. 使用模型训练时的对话模板如ChatML格式。3. 重新下载并校验模型文件。微调时Loss不下降或NaN1. 学习率过高。2. 精度问题FP16不稳定。3. 数据格式错误。4. MoE模型特有的负载均衡损失权重过大。1. 查看训练日志前几步的loss。2. 使用梯度裁剪。3. 检查数据集中是否有空值或异常长文本。1. 大幅降低学习率如从2e-4降到1e-5。2. 尝试使用BF16精度 (bf16True)。3. 清洗和预处理数据。4. 调整MoE相关损失权重如果可配置。8. 生产环境最佳实践与建议如果你计划将openPangu-2.0-Pro用于实际生产以下建议至关重要。从量化版本开始首先评估INT8或INT4量化版本是否能满足你的质量要求。这通常能减少50-75%的显存占用和提升推理速度是成本控制的第一选择。使用GPTQ、AWQ或SmoothQuant等先进的量化工具包进行量化并仔细评估量化后的性能损失。建立性能基准定义你的核心业务场景如代码生成、问答、摘要并构建一个固定的测试集。在目标硬件上系统性地测试不同批次大小、序列长度、量化精度下的吞吐量tokens/sec和延迟ms/token。记录显存占用和GPU利用率。这些数据是容量规划和成本核算的基础。实现健壮的服务化使用vLLM或TGI(Text Generation Inference) 作为推理后端它们专为生产环境设计支持动态批处理、流式输出、监控指标等。使用FastAPI或Trition Inference Server封装成HTTP/gRPC服务。添加健康检查、熔断机制、请求限流和详细的日志与指标如Prometheus。设计有效的提示工程与后处理MoE模型可能对提示格式更敏感。花时间研究技术报告或社区分享的最佳提示模板。对于关键任务实现输出验证或后处理规则如代码检查、事实核验而不是完全信任模型输出。制定明确的回滚与更新策略模型服务更新如切换量化版本、更新基础模型必须是一个可回滚的蓝绿部署过程。任何更新前必须在预发环境用基准测试集进行充分验证。关注社区动态openPangu是一个新开源项目。密切关注其官方仓库的Issue、Pull Request和Release。早期的bug修复和性能优化可能会非常频繁。openPangu-2.0-Pro的开源为业界提供了一个在能力、成本和可控性之间取得优异平衡的新选择。它不仅仅是一个模型权重文件更附带了一份详实的技术报告揭示了训练如此大规模MoE模型的工程细节。对于有实力进行私有化部署和深度定制的团队来说它提供了一个绕过闭源API依赖、构建自主AI能力的绝佳起点。然而挑战同样存在。庞大的体量意味着高昂的入门硬件成本新兴的生态意味着你需要更多的自主探索和问题解决能力。建议你按照本文的路径从环境评估、模型下载、基础推理开始逐步深入到性能测试和针对性微调。在决定大规模投入前用你的实际业务数据做一个严谨的概念验证。