活动介绍

【微调权重问题:如果您使用的是LoRA微调后的模型(如引用[2]所述),权重合并时可能出现形状不匹配】但是那么微调后的量化模型就不用再用vllm部署了?

时间: 2025-07-31 14:40:52 浏览: 23
<think>我们正在讨论LoRA微调后的模型在vLLM部署时出现权重形状不匹配的问题。根据用户提供的引用和问题,我们可以总结如下: - 用户使用LoRA微调了一个3B模型,微调前模型为5G(FP16),微调后导出的模型只有2G。这是因为LoRA只更新了低秩矩阵,存储的是这些较小的矩阵,因此模型体积变小了[^1]。 - 用户尝试使用vLLM部署微调后的模型(可能是合并后的模型)时,遇到了权重形状不匹配的AssertionError。 问题:**LoRA微调后的量化模型权重合并时出现形状不匹配错误,是否不能使用vLLM部署?** ### 回答 不是不能使用vLLM部署,但需要确保正确合并LoRA权重并保存为完整的模型格式。vLLM要求加载的模型必须具有与原始模型相同的结构(即每一层的权重形状必须一致)。出现形状不匹配错误通常是因为合并后的模型权重与vLLM期望的形状不一致。以下是可能的原因和解决方案: #### 1. **LoRA权重合并不正确** - **问题**:在合并LoRA权重时,如果操作不正确(例如,没有正确地将LoRA权重加到基础模型的权重上),会导致最终模型的权重形状与基础模型不同。 - **解决方案**:使用正确的方法合并LoRA权重。推荐使用`peft`库的`merge_and_unload()`方法: ```python from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B") peft_model = PeftModel.from_pretrained(base_model, "/path/to/lora/checkpoint") merged_model = peft_model.merge_and_unload() # 合并权重 merged_model.save_pretrained("/path/to/merged_model") ``` 这样保存的模型将是一个完整的Transformer模型,其权重形状与基础模型一致。 #### 2. **量化导致的权重形状变化** - **问题**:如果对合并后的模型进行了量化(如将FP16量化为INT4),则权重的形状(如维度)可能不会改变,但数据类型和存储方式会改变。然而,vLLM在加载模型时,要求权重的数据类型和形状与模型配置匹配。 - **解决方案**: - 如果使用vLLM部署量化模型,确保使用vLLM支持的量化方式(如AWQ、GPTQ)。例如,使用`--quantization awq`参数。 - 注意:如果合并后的模型已经进行了自定义量化(非vLLM支持的格式),则vLLM可能无法直接加载。建议先保存为FP16模型,然后让vLLM在加载时进行量化(如果支持)。 #### 3. **vLLM模型加载参数设置** - 在vLLM加载合并后的模型时,确保指定正确的参数: - `--model`: 指向合并后的模型目录。 - `--dtype`: 指定与模型权重一致的数据类型(如`--dtype bfloat16`或`--dtype float16`)。如果模型是量化后的,则需使用对应的量化参数。 - 示例命令: ```bash vllm serve --model /path/to/merged_model --dtype float16 ``` #### 4. **vLLM版本兼容性** - 确保使用的vLLM版本支持您的模型(如Qwen3-0.6B)。如果不支持,可能需要升级vLLM或使用其他部署方式(如Hugging Face TGI)。 - 升级vLLM:`pip install -U vllm` #### 5. **验证模型权重** - 在合并和保存模型后,使用以下代码验证模型权重是否加载正确(不通过vLLM): ```python from transformers import AutoModel model = AutoModel.from_pretrained("/path/to/merged_model") # 如果没有报错,说明模型权重正确 ``` ### 结论 LoRA微调后的模型可以通过正确合并权重并保存为完整模型格式来使用vLLM部署。关键步骤是: 1. 使用`merge_and_unload()`正确合并LoRA权重。 2. 保存合并后的模型为标准的Transformer格式(包含`config.json`和`pytorch_model.bin`或`safetensors`)。 3. 使用vLLM加载时,确保参数(如`--dtype`)与模型匹配。 如果仍然遇到形状不匹配错误,请检查: - 合并后的模型权重形状是否与原始基础模型一致(例如,每一层的维度是否相同)。 - vLLM的日志中报错的具体层,对比该层在基础模型和合并模型中的权重形状。 引用说明: - 引用[1]解释了LoRA微调后模型体积变小的原因(只存储低秩矩阵)[^1]。 - 引用[2]提到LoRA微调的高效性,但未直接解决部署问题[^2]。 §§相关问题§§ 1. 如何验证LoRA合并后模型的权重是否正确? 2. vLLM支持哪些量化方式的模型部署? 3. 除了vLLM,还有哪些高性能推理引擎可以部署LoRA微调后的模型?</think>### LoRA微调后量化模型权重合并问题解析 根据您的引用和问题描述,LoRA微调后模型体积变小(5G→2G)是正常现象,但部署到vLLM时出现权重形状不匹配错误。这**不是**vLLM无法部署量化模型的限制,而是权重合并过程中的技术问题。以下是具体分析和解决方案: #### 问题根源:权重合并不兼容 1. **LoRA微调机制**: - LoRA通过低秩分解矩阵$A \in \mathbb{R}^{r \times k}$和$B \in \mathbb{R}^{d \times r}$(其中$r \ll d$)更新权重$W \rightarrow W + BA$[^1] - 微调后保存的只有小矩阵$A,B$(约占总参数0.1%),导致模型体积大幅减小 ```mermaid graph LR A[原始权重W] --> B[LoRA分解] B --> C[低秩矩阵A] B --> D[低秩矩阵B] C & D --> E[微调后模型] ``` 2. **vLLM加载失败原因**: - 直接使用LoRA检查点(含$A,B$矩阵)时,vLLM期望加载完整权重$W$而非分解矩阵 - 合并操作未正确重建原始权重形状: - 预期形状:$W \in \mathbb{R}^{d \times k}$ - 实际提供:$A \in \mathbb{R}^{r \times k}$ 或 $B \in \mathbb{R}^{d \times r}$ → 触发`AssertionError: param_data.shape == loaded_weight.shape` #### 解决方案:正确合并权重 1. **标准合并流程**(必须执行): ```python from peft import PeftModel from transformers import AutoModelForCausalLM # 加载基础模型 base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B") # 加载LoRA适配器并合并 model = PeftModel.from_pretrained(base_model, "./lora_checkpoint") merged_model = model.merge_and_unload() # 关键步骤:重建完整权重 # 保存完整模型 merged_model.save_pretrained("./merged_model", safe_serialization=True) ``` 2. **vLLM部署命令修正**: ```bash vllm serve ./merged_model \ --dtype bfloat16 \ --quantization none # 确保未启用额外量化 ``` 3. **特殊场景处理**: - **若需部署量化模型**:先合并LoRA再独立量化 ```python # 合并后使用AWQ量化 from awq import AutoAWQForCausalLM quantizer = AutoAWQForCausalLM.from_pretrained("./merged_model") quantizer.quantize(save_dir="./quant_model", bits=4) ``` 部署时指定量化参数: ```bash vllm serve ./quant_model --quantization awq ``` #### 关键验证步骤 1. **检查权重形状一致性**: ```python import torch original = torch.load("Qwen/Qwen3-0.6B/pytorch_model.bin") merged = torch.load("./merged_model/pytorch_model.bin") for k in original.keys(): assert original[k].shape == merged[k].shape # 必须全部通过 ``` 2. **vLLM兼容性确认**: - Qwen3-0.6B已在vLLM v0.4+原生支持 - 确认vLLM版本:`pip show vllm | grep Version` > 引用说明:LoRA的轻量化特性使微调后模型体积显著减小[^1],但正确合并权重是部署前提。若跳过`merge_and_unload()`直接部署,必然导致形状不匹配[^2]。
阅读全文

相关推荐

最新推荐

recommend-type

基于PSCAD的500kV双极直流输电系统仿真模型构建与优化 换流器

利用PSCAD软件搭建500kV双极直流输电系统的仿真模型。首先,文中阐述了系统的核心配置,包括采用12脉动换流器、分布式参数模型的接地极线路以及双闭环控制系统。接着,重点讲解了换流器触发脉冲生成的关键代码,特别是锁相环同步信号处理和PI控制器参数调整的方法。此外,还讨论了直流线路建模中分布参数模型的应用及其优势,并指出了一些常见的建模错误和解决方案。对于接地极部分,强调了双极不平衡保护机制的重要性。最后,分享了仿真过程中遇到的问题及解决方法,如启动阶段的电压爬升曲线异常、换相失败等问题。 适合人群:电力系统工程师、科研人员、高校师生等对高压直流输电技术感兴趣的读者。 使用场景及目标:适用于希望深入了解500kV双极直流输电系统的工作原理和技术细节的研究人员;希望通过实际案例掌握PSCAD仿真的技术人员。 其他说明:文章不仅提供了理论知识,还结合具体实例进行了深入浅出的解释,有助于读者更好地理解和应用相关技术。
recommend-type

Simulink在风光火储一次调频中的应用:风机虚拟惯量、储能下垂及光伏变压减载仿真 · 风机虚拟惯量 v2.5

Simulink在风光火储(风电、光电、火力发电和储能)一次调频中的应用,重点讨论了风机虚拟惯量、储能下垂技术和光伏变压减载的关键技术及其仿真效果。首先,文章解释了风机虚拟惯量的概念和技术实现方法,通过电力电子设备模拟传统发电机的物理惯量,从而提升电力系统的稳定性。其次,文章探讨了储能下垂技术,通过控制储能设备的充放电速率来平衡电网的功率波动。最后,文章阐述了光伏变压减载技术,通过高效的仿真和高质量的波形图支持系统优化。Simulink凭借其强大的计算能力和灵活的建模方式,在这些技术的仿真研究中发挥了重要作用。 适合人群:从事电力系统研究、新能源技术开发的专业人士,尤其是对Simulink有一定了解的技术人员。 使用场景及目标:适用于研究和开发风光火储一次调频技术的科研机构和企业,旨在提高电力系统的稳定性和效率,减少频率波动的影响。 其他说明:文中还提供了简单的Matlab代码片段,展示了如何在Simulink中设置和调整相关参数,以便更好地理解和应用这些技术。此外,文章附有参考文献,供读者进一步深入了解。
recommend-type

在Windows环境下安装配置高性能负载均衡软件Haproxy

### 知识点详细说明 #### 标题:haproxy-window 标题中提到的“haproxy-window”暗示了该文档或文件集合针对的是Windows操作系统平台,特别是Windows 7 64位版本和Windows 2008 R2服务器版本。它指明了HAProxy这一软件产品在Windows环境下的兼容性和适用性。 #### 描述:兼容在win7 64bit/window2008R2下使用。Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。 描述部分详细地介绍了HAProxy的一些关键功能和特点,以及它的适用范围。 1. **HAProxy在Windows环境的兼容性**: - HAProxy通常在Linux环境下运行,不过文档描述表明它也可以在Windows 7 64位系统和Windows Server 2008 R2上运行,这提供了微软环境下的负载均衡解决方案。 2. **HAProxy定义**: - HAProxy是一个高性能的开源软件,它的主要职责是作为反向代理和负载均衡器。反向代理的工作原理是接收客户端请求,然后将这些请求转发到后端服务器,之后再将服务器的响应返回给客户端。 3. **负载均衡功能**: - HAProxy的一个核心功能是负载均衡,它能够将流量分散到多个服务器上,以避免任何单一服务器上的过载,同时提高应用的整体性能和可靠性。 4. **高可用性特性**: - 双机热备功能确保了在一个主服务器发生故障时,可以迅速切换到备用服务器上,从而实现服务的连续性,减少宕机时间。 5. **虚拟主机支持**: - 虚拟主机支持指的是HAProxy能够处理在同一IP地址上托管多个域名的网站,每个网站就像在独立服务器上运行一样。这对于在单个服务器上托管多个网站的情况非常有用。 6. **协议支持**: - HAProxy支持基于TCP和HTTP协议的应用代理。这表示它可以管理不同类型的网络流量,包括Web服务器流量和更通用的网络应用流量。 #### 标签:haproxy 标签“haproxy”强调了文档或文件集合的焦点是HAProxy负载均衡软件。这可以帮助用户快速识别文档内容与HAProxy相关的特性、配置、故障排除或使用案例。 #### 压缩包子文件的文件名称列表:haproxy-1.7.8 文件列表中“haproxy-1.7.8”指的是HAProxy的一个特定版本。这个版本号表明了用户可以预期关于该版本的具体信息、更新内容、新功能或是潜在的修复。 ### 总结 本文介绍了HAProxy在Windows环境下的应用,特别是其在Windows 7 64位和Windows Server 2008 R2操作系统上的运行能力。HAProxy作为一款负载均衡器和反向代理服务,提供了多种服务功能,包括高可用性的双机热备、支持虚拟主机以及基于TCP和HTTP协议的应用代理功能。这个软件是开源的,并且不断有新版本发布,如版本1.7.8,每一个版本都可能包含性能改进、新功能和安全更新。对于在Windows环境下寻求负载均衡解决方案的系统管理员和技术人员来说,HAProxy是一个重要的资源和工具。
recommend-type

元宇宙中的智能扩展现实:新兴理论与应用探索

# 元宇宙中的智能扩展现实:新兴理论与应用 ## 1. 元宇宙的特征 元宇宙是一个具有多种独特特征的环境,这些特征使其区别于传统的现实世界和虚拟世界。具体如下: - **协作环境**:人们在元宇宙中协作以实现经济、社会和休闲等不同目标。 - **在线空间**:基于三维的在线环境,人们可以沉浸其中。 - **共享世界**:人们能够分享活动、观点和信息,购物也成为一种网络化体验。 - **增强和科技化场所**:借助增强现实技术,人们可以丰富体验,还能通过虚拟元素、技术和互联网进行社交和互动。 - **多用户环境**:人们可以同时使用相同的技术或进行相同的活动,是现实生活的延伸。 - **无限世界
recommend-type

mockitomonkey

在讨论 **Mockito** 和 **Monkey Testing** 时,通常会涉及两个不同的技术领域:一个是单元测试中的模拟框架(Mockito),另一个是自动化测试中用于随机事件生成的测试方法(Monkey Testing)。以下是它们的定义、用途及可能的结合方式。 ### Mockito 框架概述 Mockito 是一个流行的 Java 单元测试框架,它允许开发者创建和配置模拟对象(mock objects),从而在不依赖外部系统或复杂对象的情况下测试代码逻辑。Mockito 的主要优势在于其简洁的 API 和强大的验证功能,例如: - 模拟接口或类的行为 - 验证方法调用次数
recommend-type

深度学习中的卷积运算指南:调参与矩阵操作

这篇文章是一份关于深度学习中卷积算术的指南,特别是在卷积神经网络(CNN)中的调参指导。深度学习是一种基于人工神经网络的学习方法,它在图像识别、语音识别和自然语言处理等众多领域取得了突破性的成果。而卷积神经网络是深度学习中最重要、最具影响力的一类神经网络模型,尤其在图像处理领域表现出色。本文将详细探讨卷积操作及其算术的基础知识,以及如何对其进行有效调参。 1. 卷积操作的基础 1.1 离散卷积 离散卷积是卷积神经网络中最基本的运算之一。在数学上,两个离散函数的卷积可以被定义为一个新函数,它是两个函数相对滑动并相乘后积分(或求和)的结果。在计算机视觉中,通常使用的是二维离散卷积,它处理的是图像矩阵。卷积核(或滤波器)在图像上滑动,每次与图像的一个局部区域相乘并求和,生成一个新的二维矩阵,也就是特征图(feature map)。 1.2 池化 池化(Pooling)是降低特征维度的一种常用技术,目的是减少计算量并防止过拟合。池化操作通常跟随在卷积操作之后。最常用的池化操作是最大池化(Max Pooling),它通过选择每个池化窗口内的最大值来替代该窗口内的所有值。池化操作还可以是平均池化(Average Pooling)等其他类型。 2. 卷积算术 2.1 无零填充,单位步长 在没有使用零填充(padding)和使用单位步长(stride)的情况下,卷积操作可能会导致特征图的尺寸小于输入图像尺寸。步长表示卷积核每次移动的像素数。 2.2 零填充,单位步长 零填充可以保持特征图的尺寸不变。有两种常见的零填充方式:半填充(same padding)和全填充(full padding)。半填充使得输出特征图的宽度和高度与输入一致;全填充则使得特征图的尺寸更大。 2.2.1 半(same)填充 使用半填充是为了保持特征图与输入图像尺寸一致,其计算方法是根据卷积核尺寸和步长来确定填充的数量。 2.2.2 全填充 全填充通常用于保证所有输入像素均被卷积核考虑,但结果特征图尺寸会大于输入。 2.3 无零填充,非单位步长 当步长大于1时,输出特征图的尺寸会小于使用单位步长的情况。非单位步长的卷积操作通常用于减少特征图的尺寸,以降低模型复杂度和计算量。 2.4 零填充,非单位步长 在使用非单位步长的同时,结合零填充可以更灵活地控制特征图的尺寸。可以基于需要的输出尺寸和卷积核大小来决定填充的量。 3. 池化算术 池化算术涉及到将输入特征图分割成多个区域,并从每个区域中选择代表值(通常是最大值或平均值)形成输出特征图。池化算术包括了池化区域的大小和步长的设定,其设计直接影响到网络的特征抽象能力和感受野大小。 4. 转置卷积算术 4.1 卷积作为矩阵操作 转置卷积有时被称为分数步长卷积,它在数学上可以被看作是传统卷积操作的转置。这意味着它是传统卷积操作矩阵表示的反操作。 4.2 转置卷积 转置卷积在实现上通常通过零填充和插值来扩展输入特征图的尺寸,常用于生成图像的上采样过程中,例如在像素点生成任务中。 4.3-4.6 不同的填充和步长的转置卷积 文章继续详细讨论了不同零填充和步长设置下的转置卷积算术。在转置卷积中,单位步长与非单位步长的处理方式与传统卷积相似,但转置卷积的目的在于增大特征图尺寸,这与传统卷积操作减少特征图尺寸相反。转置卷积算术在生成模型如GAN(生成对抗网络)中尤为重要,它帮助网络生成高分辨率的图像。 标签中提到了CNN调参、机器学习、深度学习和padding。这些标签体现了本文的重点是卷积神经网络中的参数调整,特别是如何通过调整padding来控制输出特征图的大小。此外,文章还涉及机器学习和深度学习的基础知识,强调了在设计CNN模型时对卷积层和池化层进行参数设置的重要性。 从文件名称列表中可以看到,这篇指南由两位作者编写,其中lecun-98.pdf可能是指Yann LeCun教授在1998年发表的关于深度学习卷积网络的开创性工作,而A guide to convolution arithmetic for deep learning.pdf正是本文档的标题。 总结来说,本文提供了一个全面的指南,通过详细讲解卷积和池化操作的各种参数设置,帮助读者理解如何在CNN中进行有效的调参,以及这些操作是如何对深度学习模型的性能产生影响的。通过合理地应用这些知识,可以优化模型结构,提高模型的性能和效率。
recommend-type

奢侈品时尚零售中的人工智能与扩展现实

# 奢侈品时尚零售中的人工智能与扩展现实 ## 1. 纳米层面的双重关系 在奢侈品时尚零售领域,纳米层面体现了一线员工与奢侈品时尚消费者之间的双重关系。一线员工不仅包括人类,还涵盖了人工智能代理,如聊天机器人和店内机器人。人类一线员工需依据零售组织文化和身份接受培训,同时享有所在国家法律规定的劳动权利和义务,并遵循时尚奢侈品牌的总体政策。 而人工智能代理在知识和情感方面不断进化,最终可能会更清晰地意识到自身存在,甚至开始主张权利,未来还有可能成为消费者。与此同时,融合纳米技术设备或采用增强能力假肢的混合人类,也能同时扮演员工和顾客的双重角色。 在这种情况下,人类与人工智能代理、不同技术水
recommend-type

两个python脚本使用互斥锁

在 Python 中,如果你想在多个脚本(或多个进程)之间共享资源并防止同时访问,可以使用互斥锁(Mutex)。互斥锁确保一次只有一个进程可以访问共享资源。通常,这种场景出现在使用 `multiprocessing` 模块时。 下面是一个使用 `multiprocessing.Lock` 的完整示例,包含两个 Python 脚本: --- ### 脚本 1:`process1.py` ```python import multiprocessing import time def worker(lock, filename): with lock: print
recommend-type

DNS与ICMP隧道技术文档资料大全

### DNS隧道技术知识点 DNS(Domain Name System,域名系统)隧道技术是一种利用DNS协议进行数据传输的方法。DNS主要用于将域名解析为IP地址,但因其请求和响应数据包具有较大的灵活性和较长的超时容忍性,所以能够被用于隐藏数据传输,从而创建一个隐蔽的通道,绕过防火墙和入侵检测系统。 #### DNS隧道的工作原理 DNS隧道通常通过构造特殊的DNS查询和响应数据包来传输数据。正常的DNS查询是针对域名的解析,而隧道化过程则是将数据封装在DNS请求和响应中。例如,可以将一段文本信息隐藏在DNS查询的域名中,然后在服务器端解析出来。同样,服务器也可以将数据伪装在DNS响应中回传给客户端。这一过程可以用以下步骤简化表示: 1. 建立隧道:客户端首先与DNS隧道服务端进行通讯,建立连接。 2. 数据封装:客户端将需要传输的数据编码后隐藏在DNS查询请求中。 3. 数据传输:通过DNS协议的正常流程发送到隧道服务器。 4. 数据解码:隧道服务器接收到DNS响应后,从中提取并解码数据。 #### DNS隧道的优势和用途 - **隐蔽性**:由于DNS流量非常普遍,它能够隐藏在正常的网络请求中,不易被监控系统识别。 - **穿透防火墙**:许多网络环境仅允许DNS流量通过,DNS隧道可以有效地绕过这些网络限制。 - **持久性**:DNS隧道可以长时间保持活跃,因为它看起来就像正常的DNS请求一样。 #### DNS隧道的风险和问题 - **安全性问题**:如果DNS隧道被恶意利用,攻击者可以通过它来传输恶意数据或作为攻击网络的通道。 - **性能影响**:由于DNS请求和响应通常较小,通过隧道传输大量数据可能会影响性能。 - **监控困难**:由于DNS隧道的隐蔽性,监控和检测其活动相对困难。 ### ICMP隧道技术知识点 ICMP(Internet Control Message Protocol,互联网控制消息协议)隧道技术利用ICMP协议的数据包在受限网络间建立通信渠道。不同于DNS隧道,ICMP通常用于发送错误消息和操作信息,但通过特定的封装技术,它也可以用于传输用户数据。 #### ICMP隧道的工作原理 ICMP隧道工作原理类似于DNS隧道,但使用的是ICMP协议。ICMP消息通常用于报告错误或发送特定的网络状态信息。在隧道中,ICMP数据包的负载部分可以包含封装的数据,使得数据能够在发送方和接收方之间进行传输。 #### ICMP隧道的优势和用途 - **避免过滤**:由于许多网络策略允许ICMP消息通过,因此通过ICMP隧道的数据可以在受限网络中传输。 - **高可靠性和效率**:与DNS隧道相比,ICMP协议的数据包不需要进行域名解析,通常能够提供更快速、更高效的通信。 #### ICMP隧道的风险和问题 - **隐蔽性较差**:相较于DNS隧道,ICMP隧道更有可能被网络监测系统识别,因为ICMP流量异常容易引起注意。 - **可能影响网络稳定**:ICMP是用于诊断网络问题的协议,大量非正常ICMP流量可能干扰网络的正常功能。 ### 总结 DNS与ICMP隧道技术提供了在受限网络环境中绕过审查和限制的方法。这些技术的有效性在于它们能够模拟正常网络流量的特性,从而隐藏隧道流量的真实目的。不过,它们的使用必须谨慎,以防止被滥用,造成安全问题。在实际应用中,了解和掌握这些技术的知识有助于更好地维护网络的安全和稳定。
recommend-type

增强现实与人工智能在药学领域的应用

### 增强现实与人工智能在药学领域的应用 在当今科技飞速发展的时代,人工智能(AI)和增强现实(AR)技术正逐渐渗透到各个领域,药学领域也不例外。这两项技术的发展为药学教育、实践以及患者护理带来了新的机遇和变革。 #### 1. AI与AR在药学教育中的应用 新兴技术的发展为药学专业的学生提供了拓展临床知识和沟通技能的新途径。AI和AR可以作为独立的教学工具,让学生置身于模拟现实世界的学习环境中。AR能提供图像、文本信息和动画等各种数据,为不同场景创建虚拟模拟,可应用于药学的多个领域,如药品开发、制造和药物发现等。以下是AR在药学教育不同课程中的具体应用: ##### 1.1 药物咨询