论文阅读笔记:Dataset Condensation with Gradient Matching

论文阅读笔记:Dataset Condensation with Gradient Matching

        • 1. 解决了什么问题?(Motivation)
        • 2. 关键方法与创新点 (Key Method & Innovation)
          • 2.1 核心思路的演进:从参数匹配到梯度匹配
          • 2.2 算法实现细节 (Implementation Details)
        • 3. 实验结果与贡献 (Experiments & Contributions)
        • 4.个人思考与启发
        • 主要代码
        • 算法逻辑总结

ICLR2021 github
在这里插入图片描述

核心思想一句话总结:

本文提出了一种创新的数据集压缩方法——数据集凝缩(Dataset Condensation,DC),其核心思想是通过梯度匹配(Gradient Matching),将一个大型数据集T浓缩成一个极小的、信息量丰富的合成数据集S。在S上从头训练的模型,其性能可以逼近在T上训练的模型,从而极大地节省了存储和训练成本。


1. 解决了什么问题?(Motivation)
  • 问题:现代深度学习依赖于大规模数据集,导致存储成本、数据传输宽带和模型训练时间急剧增加。
  • 目标:创建一个微型合成数据集S,它能作为原始大型数据集T的高效替代品,用于从零开始训练神经网络

2. 关键方法与创新点 (Key Method & Innovation)
2.1 核心思路的演进:从参数匹配到梯度匹配
  1. 参数匹配 (Parameter Matching) - 一个被否定的思路
    • 想法:直接让S训练收敛后的模型参数θS\theta_SθS与用T训练收敛后的θT\theta_TθT尽可能接近。
    • 缺陷
      • 优化路径复杂:深度网络的参数空间非凸,直接走向目标θT\theta_TθT极易陷入局部最优。
      • 计算成本高:需要嵌套的双层优化,内循环必须将模型训练至收敛,计算上不可行。
  2. 梯度匹配 (Gradient Matching) - 本文的核心创新
    • 想法:放弃匹配静态的”终点“,转而匹配动态的”过程“。即,确保在训练每一步,模型在合成数据S上产生的梯度∇Ls∇L_sLs在真实数据T上产生的梯度∇LT∇L_TLT方向一致。
    • 优势
    • 计算高效:通过一个巧妙的近似,极大提高了效率和可扩展性。
    • 优化路径清晰:每一步都有明确的监督信号(梯度差异),引导S的优化,避免了在复杂空间中盲目搜索。
    • 对齐学习动态:保证了模型在S上的学习方式与T上一致,结果更鲁棒。
2.2 算法实现细节 (Implementation Details)
  1. 课程学习 (Curriculum Learning)
    • 为了让合成数据S具有泛化性,算法采用了一个”课程学习“的框架。在整个凝缩过程中,会周期性地重新随机初始化网络参数θ\thetaθ
    • 这确保了S不会过拟合到某一个特定的网络初始化,而是对多种随机起点都有效。
  2. 梯度匹配损失函数(Gradient Matching Loss)
    • 使用**余弦距离(1-Cosine Similarity)**来衡量两个梯度的差异。这更关注梯度的方向而非大小,与梯度下降的本质契合。
    • 按输出节点分组计算:并非所有层的梯度粗暴地展平,而是按输出神经元分组计算余弦距离,更好地保留了网络结构信息。
  3. 重要的工程技巧(Practical Tricks)
    • BatchNorm层预热与冻结:由于合成数据批次极小,为了避免BN层统计量不稳定,每次迭代前都先用一个较大的真实数据批次来计算并”冻结“BN层的均值和方差。
    • 按类别独立匹配:在计算梯度时,按类别独立进行,即用”猫“的合成数据区匹配”猫“的真实数据梯度。这降低了学习难度和内存消耗。

3. 实验结果与贡献 (Experiments & Contributions)
  • 性能优越:在CIFAR-10, CIFAR-100, SVHN等数据集上,仅用极少量合成样本(如IPC=1或10),就能训练出性能远超当时其他数据压缩方法的模型。
  • 开创性贡献
    1. 首次提出了梯度匹配这一高效且可扩展的数据集凝缩范式,为后续大量的研究(如DSA, MTT, FTD等)奠定了基础。
    2. 成功将数据集凝缩技术应用到了大型网络上,证明了其可行性。
    3. 展示了其在持续学习神经架构搜索 (NAS) 等资源受限场景下的巨大潜力。

4.个人思考与启发
  • ”过程“比”结果”更重要:这篇论文最精妙的哲学在于,它揭示了在复杂优化问题中,对齐“过程”(梯度)比直接追求“结果”(参数)更有效、更可行。这一思想在很多其他领域也具有启发性。
  • 理论与实践的结合:论文不仅提出了一个优雅的理论框架,还通过BN层处理等工程技巧解决了实际应用中的痛点。
主要代码
  ''' training '''# 为合成图像image_syn创建一个优化器# 我们只优化image_syn这个张量,所有优化器只传入它。# 这里的优化器是SGD,意味着我们会用梯度下降法来更新图像的像素值。optimizer_img = torch.optim.SGD([image_syn, ], lr=args.lr_img, momentum=0.5) # optimizer_img for synthetic data# 清空优化器的梯度缓存optimizer_img.zero_grad()# 定义用于计算分类损失的损失函数,这里是标准的交叉熵损失。criterion = nn.CrossEntropyLoss().to(args.device)print('%s training begins'%get_time())# 主迭代循环开始# 这个循环是整个数据集凝缩过程的核心,总共进行Iteration+1次。for it in range(args.Iteration+1):# 评估合成数据(在特定迭代点触发)''' Evaluate synthetic data '''if it in eval_it_pool:for model_eval in model_eval_pool:# 遍历model_eval_pool中的每一个模型架构,用于评估。# 这运行我们测试合成数据集在不同模型上的泛化能力。print('-------------------------\nEvaluation\nmodel_train = %s, model_eval = %s, iteration = %d'%(args.model, model_eval, it))# 设置评估时的数据增强策略if args.dsa:# 如果是DSA方法,使用其特定的增强策略。args.epoch_eval_train = 1000args.dc_aug_param = Noneprint('DSA augmentation strategy: \n', args.dsa_strategy)print('DSA augmentation parameters: \n', args.dsa_param.__dict__)else:# 如果是DC方法,调用 get_daparam 获取专为DC设计的增强参数。# 注意:这些增强只在评估时使用,在生成合成数据时不用。args.dc_aug_param = get_daparam(args.dataset, args.model, model_eval, args.ipc) # This augmentation parameter set is only for DC method. It will be muted when args.dsa is True.print('DC augmentation parameters: \n', args.dc_aug_param)# 如果在评估时使用了任何数据增强,就需要更多的训练轮数来让模型充分学习。if args.dsa or args.dc_aug_param['strategy'] != 'none':args.epoch_eval_train = 1000  # Training with data augmentation needs more epochs.else:args.epoch_eval_train = 300# --- 3.2 执行评估 ---# 创建一个空列表,用于存储多次评估的准确率accs = []# 为了结果的稳定性,我们会用当前的合成数据训练num_eval个独立,随机初始化的模型。for it_eval in range(args.num_eval):# 每一次都创建一个全新的、随机初始化的评估网络。net_eval = get_network(model_eval, channel, num_classes, im_size).to(args.device) # get a random model# 深拷贝当前的合成数据和标签,以防止在评估函数中被意外修改。# detach()是为了确保我们只复制数据,不带计算图。image_syn_eval, label_syn_eval = copy.deepcopy(image_syn.detach()), copy.deepcopy(label_syn.detach()) # avoid any unaware modification# 调用核心评估函数 evaluate_synset。# 这个函数会:# 1. 拿 image_syn_eval 从头开始训练 net_eval。# 2. 在训练结束后,用训练好的 net_eval 在真实的测试集 testloader 上进行测试。# 3. 返回在测试集上的准确率 acc_test。_, acc_train, acc_test = evaluate_synset(it_eval, net_eval, image_syn_eval, label_syn_eval, testloader, args)accs.append(acc_test)# 打印这次评估的平均准确率和标准差。print('Evaluate %d random %s, mean = %.4f std = %.4f\n-------------------------'%(len(accs), model_eval, np.mean(accs), np.std(accs)))# 如果这是最后一次迭代,将这次评估的所有准确率结果记录到总的实验结果字典中。if it == args.Iteration: # record the final resultsaccs_all_exps[model_eval] += accs# 可视化并保存合成图像''' visualize and save '''save_name = os.path.join(args.save_path, 'vis_%s_%s_%s_%dipc_exp%d_iter%d.png'%(args.method, args.dataset, args.model, args.ipc, exp, it))# 深拷贝合成图像,并移到CPU上进行处理。image_syn_vis = copy.deepcopy(image_syn.detach().cpu())# 对图像进行反归一化,以便人眼观察# 训练时图像通常是归一化的。# 反归一化公式:pixel = pixel * std + meanfor ch in range(channel):image_syn_vis[:, ch] = image_syn_vis[:, ch]  * std[ch] + mean[ch]# 将像素值裁剪到[0,1]范围内,防止因浮点数误差导致显示异常。image_syn_vis[image_syn_vis<0] = 0.0image_syn_vis[image_syn_vis>1] = 1.0# 使用torchvision.utils.save_image将合成图像保存为一张网格图。# nrow=args.ipc表示每行显示ipc张图像。save_image(image_syn_vis, save_name, nrow=args.ipc) # Trying normalize = True/False may get better visual effects.# --- 初始化课程学习环境 ---''' Train synthetic data '''# 每次主迭代(it)开始,都创建一个全新的、随机初始的网络。# 这是”课程学习“的关键:确保合成数据对不同的网络初始化方法都有效,而不是过拟合到某一个。net = get_network(args.model, channel, num_classes, im_size).to(args.device) # get a random modelnet.train()  # 将网络设置为训练模式# 获取网络的所有可学习参数net_parameters = list(net.parameters())# 为这个新网络创建一个优化器,用于在内循环中更新网络参数optimizer_net = torch.optim.SGD(net.parameters(), lr=args.lr_net)  # optimizer_img for synthetic dataoptimizer_net.zero_grad()# 初始化平均损失,用于记录和打印loss_avg = 0# 在生成合成数据时,不使用任何数据增强,以与DC论文的设置保持一致args.dc_aug_param = None  # Mute the DC augmentation when learning synthetic data (in inner-loop epoch function) in oder to be consistent with DC paper.# --- 课程学习外循环(Outer Loop) ---# 这个循环对应论文算法中的外循环,用于实现课程学习。for ol in range(args.outer_loop):# -- BatchNorm层预热与冻结(一个非常重要的工程技巧) --''' freeze the running mu and sigma for BatchNorm layers '''# Synthetic data batch, e.g. only 1 image/batch, is too small to obtain stable mu and sigma.# So, we calculate and freeze mu and sigma for BatchNorm layer with real data batch ahead.# This would make the training with BatchNorm layers easier.# 动机:合成数据的批次非常小(例如ipc=1),如果让BN层在这么小的批次上计算均值和方差,结果会极其不稳定,导致训练困难。# 解决方案:先用一个包含多个真实样本的”大“批次来预热BN层,计算出稳定的统计量,然后将其冻结。BN_flag = FalseBNSizePC = 16  # for batch normalization 每个类别用于BN预热的样本数# 检查网络中是否存在BN层for module in net.modules():if 'BatchNorm' in module._get_name(): #BatchNormBN_flag = Trueif BN_flag:# 从每个类别中抽取BNSizePC个真实图像,拼接成一个大批次。img_real = torch.cat([get_images(c, BNSizePC) for c in range(num_classes)], dim=0)# 确保网络在训练模式,以便BN层可以更新其 running_mean 和 running_var。net.train() # for updating the mu, sigma of BatchNorm# 进行一次前向传播,这个操作会自动更新BN层的统计量。output_real = net(img_real) # get running mu, sigma# 将所有BN层切换到评估模式。# 在评估模式下,BN层会使用已经计算好的 running_mean 和 running_var,而不会再根据新的输入来更新它们。# 这就实现了“冻结”的效果。for module in net.modules():if 'BatchNorm' in module._get_name():  #BatchNormmodule.eval() # fix mu and sigma of every BatchNorm layer# --- 核心:通过梯度匹配更新合成数据 ---''' update synthetic data '''# 初始化当前外循环的总损失loss = torch.tensor(0.0).to(args.device)# 按照类别独立进行梯度匹配,这个是论文提出的另外一个技巧。for c in range(num_classes):# 准备真实数据和合成数据img_real = get_images(c, args.batch_real)lab_real = torch.ones((img_real.shape[0],), device=args.device, dtype=torch.long) * cimg_syn = image_syn[c*args.ipc:(c+1)*args.ipc].reshape((args.ipc, channel, im_size[0], im_size[1]))lab_syn = torch.ones((args.ipc,), device=args.device, dtype=torch.long) * c# 如果使用DSA方法,对真实和合成图像应用相同的可微数据增强if args.dsa:seed = int(time.time() * 1000) % 100000img_real = DiffAugment(img_real, args.dsa_strategy, seed=seed, param=args.dsa_param)img_syn = DiffAugment(img_syn, args.dsa_strategy, seed=seed, param=args.dsa_param)# --- 计算真实梯度 gw_real ---output_real = net(img_real)loss_real = criterion(output_real, lab_real)# 计算损失对网络参数的梯度gw_real = torch.autograd.grad(loss_real, net_parameters)# clone()和detach()是为了将梯度值复制下来,并切断其与计算图的联系,# 因为我们只需要它的数值作为匹配目标,不希望梯度回流真实数据。gw_real = list((_.detach().clone() for _ in gw_real))# -- 计算合成梯度gw_syn --output_syn = net(img_syn)loss_syn = criterion(output_syn, lab_syn)# 关键所在:create_graph=True# 这个参数告诉pytorch,在计算gw_syn时,要保留其计算图。# 这意味着gw_syn本身也成为了一个计算图中的节点,它依赖于iamge_syn.# 因此,后续对gw_syn的损失进行反向传播时,梯度可以一直流回image_syn。gw_syn = torch.autograd.grad(loss_syn, net_parameters, create_graph=True)# 计算真实梯度和合成梯度之间的匹配损失,余弦相似度loss += match_loss(gw_syn, gw_real, args)# 更新合成图像optimizer_img.zero_grad()  # 清空image_syn的梯度缓存loss.backward()   # 反向传播,计算匹配损失对image_syn对image_syn的梯度optimizer_img.step()  # 根据梯度更新image_syn的像素值loss_avg += loss.item()  # 累加损失用于打印# 如果是最后一个外循环,就不需要再更新网络了,直接跳出。if ol == args.outer_loop - 1:break# --- 2.3 内循环:用更新后的合成数据训练网络 ---''' update network '''# 第二步:现在轮到网络来适应更新后的合成数据了。image_syn_train, label_syn_train = copy.deepcopy(image_syn.detach()), copy.deepcopy(label_syn.detach())  # avoid any unaware modificationdst_syn_train = TensorDataset(image_syn_train, label_syn_train)trainloader = torch.utils.data.DataLoader(dst_syn_train, batch_size=args.batch_train, shuffle=True, num_workers=0)# 对网络进行inner_loop次的训练更新。for il in range(args.inner_loop):epoch('train', trainloader, net, optimizer_net, criterion, args, aug = True if args.dsa else False)# 记录和保存# 计算并打印平均损失loss_avg /= (num_classes*args.outer_loop)if it%10 == 0:print('%s iter = %04d, loss = %.4f' % (get_time(), it, loss_avg))# 如果是最后一次主迭代,保存所有结果if it == args.Iteration: # only record the final resultsdata_save.append([copy.deepcopy(image_syn.detach().cpu()), copy.deepcopy(label_syn.detach().cpu())])torch.save({'data': data_save, 'accs_all_exps': accs_all_exps, }, os.path.join(args.save_path, 'res_%s_%s_%s_%dipc.pt'%(args.method, args.dataset, args.model, args.ipc)))

算法逻辑总结

你追我赶”的双重优化过程:

  1. 课程学习 (Outer Loop):
    • 每一次外循环,都像是新学期开学,我们找来一个“新生”(一个随机初始化的 net)。
    • 这个“新生”的存在,是为了确保我们的“教材”(合成数据 image_syn)是普适的,对任何基础的学生都有效。
  2. 教材编写 (Update Synthetic Data):
    • 这是核心步骤。我们让“新生” net 分别看“官方教材”(真实数据 img_real)和我们正在编写的“浓缩笔记”(合成数据 img_syn)。
    • 我们记录下“新生”看完两种材料后的“学习心得”(梯度 gw_realgw_syn)。
    • 我们的目标是修改“浓缩笔记” img_syn,使得“新生”看完它之后产生的“学习心得” gw_syn 和看完“官方教材”产生的 gw_real 一模一样
    • create_graph=True 是实现这一点的技术关键,它允许我们对“学习心得”本身求导,从而知道该如何修改“浓y缩笔记”的每一个字(像素)。
  3. 学生自习 (Update Network):
    • “浓缩笔记” image_syn 更新完毕后,我们让“新生” net 对着这本新版的笔记自习几遍inner_loop次)。
    • 这会让“新生”对当前的“浓缩笔记”有更深的理解,为下一轮的“教材编写”做好准备。

这个“编写教材 -> 学生自习 -> 换个新生再来一遍”的过程不断重复,最终使得“浓缩笔记” image_syn 变得越来越精华,能够高效地替代“官方教材” T

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917889.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网安学习no.22

一、基础系统信息命令&#xff08;简单入门&#xff09;uname作用&#xff1a;查看系统内核信息示例&#xff1a;uname -a&#xff08;显示完整内核版本、主机名、硬件架构等&#xff09;hostname作用&#xff1a;查看或设置主机名示例&#xff1a;hostname&#xff08;显示当前…

AJAX的引入

是的&#xff0c;AJAX 的一个主要特点就是通过 局部刷新 来实现与服务器的交互&#xff0c;而不需要重新加载整个页面。通过 AJAX&#xff0c;JavaScript 可以发送异步的 HTTP 请求&#xff0c;接收到响应数据后&#xff0c;更新页面的某个部分&#xff08;DOM&#xff09;。这…

SpringBoot 整合 Langchain4j AIService 深度使用详解

目录 一、前言 二、AIService 介绍 2.1 AiService 是什么 2.2 AiService 主要功能 2.3 AiService 使用步骤 三、AIService 操作实践 3.1 前置准备 3.1.1 获取apikey 3.1.2 导入核心依赖 3.1.3 添加配置文件 3.1.4 前置导入案例 3.2 AIService 案例操作详解 3.2.1 入…

基于FFmpeg和HLS的大文件分片传输方案

1&#xff1a;功能介绍 在视频这类大文件的传输过程中&#xff0c;经常会因为文件太大而受到网络带宽的限制。比如在实现视频预览功能时&#xff0c;常常会出现长时间加载、缓存卡顿的问题。我在项目中也遇到了类似的情况&#xff0c;于是采用了这个解决方案。 我们可以利用 FF…

体育场预定-下单-扣减库存一致性

流程1:通过库存服务缓存(缓存里面不仅有位图存储该时间点id的位置信息还有库存信息)的Redis获取令牌2:拿着令牌向订单服务同步下单如果有令牌就执行下面的Redis&#xff0c;如果没有就直接返回扣减Redis库存缓存扣减成功:继续扣减失败:返回前端重试整套流程3:1锁2查3更新生成订…

【计算机网络】王道考研笔记整理(3)数据链路层

目录 第三章 数据链路层 3.1 数据链路层的功能 3.2 组帧 3.2.1 字符计数法 3.2.2 字节填充法 3.2.3 零比特填充法 3.2.4 违规编码法 3.3 差错控制 3.3.1 奇偶校验码 3.3.2 CRC 校验码 3.3.3 海明校验码 3.4 可靠传输与流量控制 3.4.1 滑动窗口机制 3.4.2 停止 - 等待…

【后端】java 抽象类和接口的介绍和区别

文章目录一、抽象类&#xff08;Abstract Class&#xff09;二、接口&#xff08;Interface&#xff09;三、核心区别总结四、使用场景对比五、从设计思想理解最佳实践在Java中&#xff0c;抽象类&#xff08;Abstract Class&#xff09;和接口&#xff08;Interface&#xff0…

Apache OFBiz Scrum 组件命令注入漏洞

【严重】Apache OFBiz Scrum 组件命令注入漏洞 漏洞描述 Apache OFBiz 是一款知名的开源企业资源规划(ERP)解决方案&#xff0c;它提供了一整套开箱即用的企业级应用。Scrum 是 OFBiz 的一个插件&#xff0c;旨在为敏捷开发团队提供项目管理功能&#xff0c;其中包括与 SVN 版…

FastAPI入门:多个文件、后台任务、元数据和文档 URL

更大的应用 - 多个文件 假设文件结构如下&#xff1a;. ├── app # 「app」是一个 Python 包 │ ├── __init__.py # 这个文件使「app」成为一个 Python 包 │ ├── main.py # 「main」模块&#xff0c;例如 import app.main │ ├…

一个示例mcp agent功能的交互式框架

https://github.com/whym3/Deepseek_MCPDeepseek_MCP https://github.com/whym3/Deepseek_MCP Deepseek_MCP是一个演示mcp agent的框架&#xff0c;基于Flask开发&#xff0c;支持在浏览器采用交互方式与deepseek及agent对话。需要注册外部Deepseek api&#xff0c;不支持本地…

nodejs 基础知识-2

模块的暴露和导入 编写date.js module.exports.echo 导出的名称 module.exports.echo function echo(){ return Date.now(); } 编写 index.js const echoDate require(‘./date.js’) 在index引入 console.log(echoDate.echo()); //调用 开发一个自定义模块 exports.forma…

递归推理树(RR-Tree)系统:构建认知推理的骨架结构

探索基于三维评估的动态推理系统如何实现智能决策与知识演化引言 在复杂问题求解领域&#xff08;如战略决策或科学探索&#xff09;&#xff0c;人类思维的递归本质为AI系统设计提供了重要启发。我设计并实现的递归推理树&#xff08;Recursive Reasoning Tree, RR-Tree&#…

《动手学深度学习》读书笔记—9.5机器翻译与数据集

本文记录了自己在阅读《动手学深度学习》时的一些思考&#xff0c;仅用来作为作者本人的学习笔记&#xff0c;不存在商业用途。 语言模型是自然语言处理的关键&#xff0c; 而机器翻译是语言模型最成功的基准测试。 因为机器翻译正是将输入序列转换成输出序列的 序列转换模型&a…

Mysql进行操作时锁的具体行为

场景一&#xff1a;单个事务更新一条存在的数据 假设有表 user (id PK, name, age)&#xff0c;数据&#xff1a;[id1, nameAlice, age25] 你的 SQL&#xff1a; UPDATE user SET age 26 WHERE id 1; 底层动作&#xff1a; 事务 A (主动方) 发起更新请求。Lock Manager 介入&…

人工智能领域、图欧科技、IMYAI智能助手2025年7月更新月报

IMYAI 平台 2025 年 7 月重要功能更新与优化汇总 2025年07月31日更新 细节优化&#xff1a; 修复了移动端提交后自动弹出侧边栏的BUG。优化对话高级配置界面&#xff0c;增加滚动条并固定高度&#xff0c;避免内容超出屏幕。音乐生成界面的人声选择新增“合唱”选项&#xff…

HTTP 与 HTTPS 的区别深度解析:从原理到实践

HTTP 和 HTTPS 是现代 Web 开发中不可或缺的协议&#xff0c;它们决定了浏览器与服务器之间数据传输的方式。HTTPS 作为 HTTP 的安全版本&#xff0c;在安全性、性能和用户体验上都有显著提升。本文将通过万字篇幅&#xff0c;结合图表和代码示例&#xff0c;详细剖析 HTTP 与 …

STM32F407VET6学习笔记11:smallmodbus_(多从机)创建新的slave从机

今日记录一些smallmodbus 创建新的slave 从机 的过程&#xff0c;以及使用的关键点. 目录 创建新的从机对应操作函数与buffer 创建新的从机线程与操作代码&#xff1a; slave使用的要点&#xff1a; 完整的slave代码&#xff1a; 能正常通信&#xff1a; 创建新的从机对应操作函…

【论文阅读】Transformer Feed-Forward Layers Are Key-Value Memories

Transformer Feed-Forward Layers Are Key-Value Memories 原文摘要 研究背景与问题&#xff1a; 前馈层占Transformer模型参数总量的2/3&#xff0c;但其功能机制尚未得到充分研究 核心发现&#xff1a;提出前馈层实质上是键值存储系统 键&#xff1a;这里的键与训练数据中出…

昇思+昇腾开发板:DeepSeek-R1-Distill-Qwen-1.5B 模型推理部署与 JIT 优化实践

目录 引言 模型推理部署 环境准备 安装 MindSpore 查看当前 mindspore 版本 安装 MindNLP 模型与分词器加载 导入必要的库 加载分词器 加载模型 对话功能实现 设置系统提示词 构建对话历史输入 推理函数实现 交互界面实现 推理JIT优化 基础环境安装 JIT 优化配置…

用phpstudy安装php8.2后报错:意思是找不到php_redis.dll拓展时

1.地址&#xff1a;https://pecl.php.net/package/redis/6.2.0/windows 2.下载3.解压后复制php_redis.dll到phpstudy_pro\Extensions\php\php8.2.9nts\ext目录 4.打开php.ini&#xff0c;加上 extension_dir “D:\software\phpstudy_pro\Extensions\php\php8.2.9nts\ext”