`)
人工智能深度学习机器学习计算机视觉NLP强化学习【免费下载链接】deepmind-researchThis repository contains implementations and illustrative code to accompany DeepMind publications项目地址https://gitcode.com/gh_mirrors/de/deepmind-research点击查看免费下载导读本文围绕 deepmind-research 仓库中的 kfac_ferminet_alpha 模块展开该模块是论文《Better, Faster Fermionic Neural Networks》James S. Spencer、David Pfau、Aleksandar Botev 与 W. M. C. FoulkesarXiv:2011.07125的配套代码提供了在 JAX 中实现的 K-FACKronecker-Factored Approximate Curvature二阶优化器其理论基础源自 Martens 与 Grosse 的经典论文《Optimizing Neural Networks with Kronecker-factored Approximate Curvature》arXiv:1503.05671。阅读本文后你将掌握如何安装该包、如何通过内置示例脚本跑通一个完整的 K-FAC 训练循环、如何配置优化器的全部核心参数学习率、动量、阻尼、burn-in、估计模式、多设备等以及自动标签注册、曲率估计与分块求逆等底层实现原理。本模块的典型应用场景是 FermiNet费米子神经网络的波函数训练即 README 中提到的 FermiNet 项目但作为一个通用的 K-FAC 优化器它也适用于普通的前馈网络、卷积网络等任意 JAX 可微模型。一、模块概览一篇 README 背后的完整工程kfac_ferminet_alpha/README.md 篇幅简短但仓库中与之配套的源码构成了一套相当完整的 K-FAC 工程实现。核心文件及其职责如下文件职责optimizer.py顶层Optimizer类面向最终用户的主入口estimator.pyCurvatureEstimator类负责各种曲率估计模式与块级矩阵运算curvature_blocks.py各类曲率块Dense 双 Kronecker 块、NaiveDiagonal、ScaleAndShift 等tag_graph_matcher.py基于 JAXPR 的图匹配自动打标签auto-tagginglayers_and_loss_tags.pyLayerTag/LossTag打标签原语及 dense/conv2d/scale-and-shift 注册loss_functions.py损失函数类与register_normal_predictive_distribution等注册入口tracer.py提取 JAXPR 中的标签并构造损失矩阵向量积JVP/VJPdistributions.py损失函数所需的分布实现如MultivariateNormalDiagutils.py多设备操作、指数移动平均、pi-adjusted 求逆、Stateful 状态管理等工具example.py官方示例训练脚本自编码器 K-FACtests/图匹配与 tracer 的单元测试run.sh一键安装并运行示例的脚本requirements.txt / setup.py依赖声明与 pip 打包配置模块对外只暴露三个最常用的符号见init.pyOptimizer、register_normal_predictive_distribution与register_squared_error_loss这正是模块化、面向最终用户的设计体现。二、环境依赖与安装2.1 依赖清单所有包依赖都记录在 requirements.txt 中jax0.2.10 dataclasses0.6 networkx2.1 numpy1.16.4 typing3.7.4.3 ordered-set4.0.2 absl-py0.12.0从依赖中可以看出三个关键设计点networkx 与 ordered-settag_graph_matcher.py使用 networkx 构建计算图nx.DiGraph用 ordered-set 保证图搜索候选集合的确定性顺序absl-py命令行参数解析采用absl.flags见 example.py 中大量flags.DEFINE_*JAX 版本代码中有针对 JAX 0.3.4 以上版本的条件分支见 layers_and_loss_tags.py 的abstract_eval说明该实现是围绕早期 JAX0.2.x编写的使用前请确认 JAX 版本兼容性。2.2 安装方式README 原文命令按 README 的说明先克隆仓库再 pip 安装git clone gitgithub.com:deepmind/deepmind-research.git pip install deepmind_research/kfac_ferminet_alpha/setup.py 中定义了包名kfac_ferminet_alpha版本 0.0.1Apache License 2.0package_dir{kfac_ferminet_alpha: .}表明包根目录即当前目录install_requires与 requirements.txt 一致。2.3 一键脚本安装推荐仓库还提供了 run.sh它会在干净的虚拟环境中安装全部依赖并直接运行示例训练循环。脚本设计为在仓库父目录执行git clone gitgithub.com:deepmind/deepmind-research.git cd deepmind_research kfac_ferminet_alpha/run.sh脚本内部流程python3 -m venv /tmp/kfac_ferminet_alpha_example source /tmp/kfac_ferminet_alpha_example/bin/activate pip3 install -U pip pip3 install -r kfac_ferminet_alpha/requirements.txt # 如需 GPU请手动安装带 CUDA 的 jaxlib例如 # pip3 install --upgrade jax jaxlib0.1.64cuda110 -f https://storage.googleapis.com/jax-releases/jax_releases.html pip3 install jaxlib pip3 install kfac_ferminet_alpha/ python3 kfac_ferminet_alpha/example.py注意脚本注释中的 GPU 提示CPU 环境只需pip3 install jaxlibGPU 环境则需要按注释手动安装匹配 CUDA 版本的jaxlib示例中给出的 jaxlib 0.1.64cuda110 是针对当时版本的具体选择实际使用时请以你安装的 JAX 版本对应的 jaxlib 为准。三、快速上手运行官方示例训练脚本3.1 示例脚本的模型标准自编码器example.py 是一个可独立运行的完整示例演示了一个标准自编码器autoencoder的 K-FAC 训练。其模型结构在model_init中定义def model_init(rng_key, batch, encoder_sizes(1000, 500, 250, 30)): Initialize the standard autoencoder. x_size batch.shape[-1] decoder_sizes encoder_sizes[len(encoder_sizes) - 2::-1] sizes (x_size,) encoder_sizes decoder_sizes (x_size,) keys jax.random.split(rng_key, len(sizes) - 1) params [] for rng_key, dim_in, dim_out in zip(keys, sizes, sizes[1:]): # Glorot uniform initialization w glorot_uniform((dim_in, dim_out), rng_key) b jnp.zeros([dim_out]) params.append((w, b)) return params, None网络共 8 个全连接层输入 20 维 → 1000 → 500 → 250 → 30 → 250 → 500 → 1000 → 20参数用 Glorot uniform 初始化glorot_uniform函数见 example.py激活函数为tanh最后一层无非线性损失为带 L2 正则的均方误差model_loss。3.2 示例脚本的命令行参数示例脚本通过 absl flags 暴露了全部训练超参数默认值如下Flag默认值含义--training_steps100训练步数--batch_size128批大小--learning_rate1e-3学习率--l2_reg1e-3L2 正则化系数--momentum0.8动量系数--damping1e-2阻尼系数--multi_deviceFalse是否在多个设备上复制计算pmap--seed12412321JAX RNG 种子运行方式在安装好包之后python3 kfac_ferminet_alpha/example.py python3 kfac_ferminet_alpha/example.py --batch_size64 --learning_rate1e-4 --training_steps5003.3 训练循环的主干流程示例脚本的主流程main展示了 K-FAC 优化器的标准使用模式共五个步骤构造 RNG 键jax.random.split(rng, 4)拆出params_key、opt_key、step_key、data_key四路初始化参数jit_init_parameters_func(params_key, example_batch)单设备用jax.jit多设备用jax.pmap并把 RNG 键等复制到所有设备上见 example.py创建优化器实例化kfac_ferminet_alpha.Optimizer(...)初始化优化器状态opt_state optim.init(params, opt_key, example_batch, func_state)循环执行 step每次optim.step(params, opt_state, key_t, dataset, learning_rate..., momentum..., damping...)并打印stats[loss]与stats[aux]。其中第 3 步的Optimizer构造非常关键optim kfac_ferminet_alpha.Optimizer( value_and_grad_funcjax.value_and_grad( lambda p, x: model_loss(p, x, L2_REG.value), has_auxTrue), l2_regL2_REG.value, value_func_has_auxTrue, value_func_has_stateFalse, value_func_has_rngFalse, learning_rate_scheduleNone, momentum_scheduleNone, damping_scheduleNone, norm_constraint1.0, num_burnin_steps10, )注意value_and_grad_func是jax.value_and_grad包装后的函数has_auxTrue表示损失函数同时返回辅助统计量l2_reg必须与损失函数中实际使用的正则化系数一致norm_constraint1.0开启基于 Fisher 范数的更新缩放num_burnin_steps10表示前 10 步只更新曲率估计而不更新参数。3.4 step 返回的统计量每次optim.step返回(params, opt_state, stats)其中stats是一个 dict见 optimizer.py 的_step实现包含step当前步数计数器loss当前 mini-batch 的损失值learning_rate、momentum、damping本次更新实际使用的超参数值rho更新缩减比当前实现中固定为jnp.nan表明自适应学习率/阻尼的 reduction-ratio 机制尚未启用代码注释# Optionally compute the reduction ratio and update the damping即为此预留aux仅当value_func_has_auxTrue时出现携带损失函数返回的辅助信息示例中即mean_squared_error。四、Optimizer 核心参数全解kfac_ferminet_alpha/optimizer.py 中Optimizer.__init__的完整参数签名如下Optimizer( value_and_grad_func, l2_reg, value_func_has_auxFalse, value_func_has_stateFalse, value_func_has_rngFalse, learning_rate_scheduleNone, momentum_scheduleNone, damping_scheduleNone, min_damping1e-8, max_dampingjnp.inf, norm_constraintNone, num_burnin_steps10, estimation_modefisher_gradients, curvature_ema0.95, inverse_update_period5, register_only_genericFalse, layer_tag_to_block_clsNone, patterns_to_skip(), donate_parametersFalse, donate_optimizer_stateFalse, donate_batch_inputsFalse, donate_func_stateFalse, batch_process_funcNone, multi_deviceFalse, use_jax_condTrue, debugFalse, pmap_axis_namekfac_axis, )下面按功能分组讲解各参数的含义与源码依据。4.1 函数签名与函数状态相关value_and_grad_func必须返回损失值与其梯度。若value_func_has_auxFalse接口为loss, loss_grads func(params, batch)若为True接口为(loss, aux), loss_grads func(params, batch)。优化器内部还会用utils.convert_value_and_grad_to_value_func从中提取纯损失函数丢弃梯度用于标签注册与曲率估计的前向追踪。value_func_has_state表示损失函数是否持有持久化状态如 BatchNorm 的运行统计有状态时状态会被传入并返回更新版本。value_func_has_rng表示损失函数是否额外接收一个 RNG 键如带 dropout 的模型。对应的utils.py 的make_func_args会按(params, [func_state], [rng], batch)的顺序组装调用参数。4.2 超参数与调度l2_reg告诉优化器你使用的 L2 正则化系数正则项形式为coeff / 2 * sum(param**2)。注意用户仍须自行在损失中加入正则项该参数只是让曲率块在求逆时把正则项计入对角权重见 optimizer.py 的注释。learning_rate_schedule/momentum_schedule/damping_schedule均为Callable[[step], jnp.ndarray]类型的调度函数输入当前步数、输出对应的标量值。一旦设置了某个 schedule就不允许再向step()传对应的值——verify_args_and_get_step_counter会抛出ValueError见 optimizer.py。此外momentum_schedule会被包装成第一步动量为 0的版本schedule_with_first_step_zero因为 burn-in 阶段之后的第一步动量必须从 0 开始见 optimizer.py 与step()中momentum jnp.zeros([])的处理。min_damping/max_damping阻尼参数的下界默认 1e-8与上界默认无穷大。文档注释特别提醒默认值 1e-8 相当随意可能需要按具体问题上下调整若使用了非零的l2_reg有可能把min_damping设为 0。norm_constraint若指定则更新会被缩放使其近似平方 Fisher 范数v^T F v不超过该值注意这里的F是近似曲率矩阵而非精确 Fisher。其实现位于propose_directions见 optimizer.py先计算preconditioned_grads estimator.multiply_matpower(grads, -1)再计算max_coefficient sqrt(norm_constraint / (grads·preconditioned_grads * lr^2))取min(max_coefficient, 1)作为缩放系数。这就是Trust region式的自适应步长保护。4.3 曲率估计相关estimation_mode选择曲率矩阵的估计方式可选值为fisher_gradients默认、fisher_empirical、fisher_exact、fisher_curvature_prop、ggn_exact、ggn_curvature_prop。各模式含义详见 estimator.py 的 docstring核心区别是fisher_gradients原始 K-FAC 论文的基础估计方式从模型分布采样目标并计算梯度外积fisher_curvature_prop用随机 ±1 向量与 Fisher 的半因子自乘来估计对应 arXiv:1206.6464fisher_exactfisher_curvature_prop的推广通过遍历输出每个坐标的 one-hot 向量计算精确 Fisher代价约为其他模式的输出维度倍fisher_empirical使用数据分布作为目标分布的经验 Fisher要求每个注册的损失都指定 targets当前代码中该分支抛出NotImplementedError见 estimator.pyggn_curvature_prop/ggn_exact与 Fisher 对应模式类似但估计的是 Generalized Gauss-Newton 矩阵。不同估计模式的实现细节随机采样、one-hot 循环、EMA 权重技巧见 estimator.py。curvature_ema曲率协方差估计的指数移动平均衰减因子默认 0.95。每个曲率块使用utils.WeightedMovingAverage见 utils.py维护value array / weight更新公式为weight ema_old * weight ema_new、array ema_old * array ema_new * value。inverse_update_period每隔多少步更新一次曲率逆的近似默认 5。实现位于_step中的lax.cond(self.step_counter % self.inverse_update_period 0, ...)见 optimizer.py——这是稀疏求逆策略因为矩阵求逆开销远大于估计更新。num_burnin_steps优化开始前如第一步先执行多少次只更新曲率估计、不更新参数的预热步骤默认 10。burn-in 中ema_old1.0, ema_new1/num_burnin_steps见 optimizer.py相当于对前若干 mini-batch 做均匀平均。首次调用step()时若step_counter_int 0会先循环执行num_burnin_steps次_jit_burnin见 optimizer.py。4.4 标签注册与块覆盖register_only_generic为True时自动打标签只注册 generic 参数即所有参数都当作朴素对角块处理为False默认时图匹配器会自动识别 dense/conv2d/scale-and-shift 等模式并注册对应的层标签。layer_tag_to_block_cls从层标签名到块类的映射用于覆盖默认的块近似选择。默认映射见 curvature_blocks.py_default_tag_to_block dict( dense_tagDenseTwoKroneckerFactored, generic_tagNaiveDiagonal, scale_and_shift_tagScaleAndShiftDiagonal, )patterns_to_skip图匹配器自动打标签时应跳过的模式名元组如(dense_with_bias,)用于排除某些不希望被 Kronecker 块处理的子图。4.5 性能与设备相关donate_parameters/donate_optimizer_state/donate_batch_inputs/donate_func_state是否用 JAX 的donate_argnums捐赠对应参数的内存缓冲区以节省显存。注意捐赠后旧值的缓冲区将不可再访问。batch_process_func在把 batch 送入设备前对其做预处理的可选函数默认恒等函数lambda x: x。multi_device是否使用pmap在多设备上运行。启用后优化器的 init/burnin/step 都被jax.pmap包装见 optimizer.pyRNG 通过utils.make_different_rng_key_on_all_devices保证各设备键不同统计量通过pmean_if_pmap跨设备取平均。debug为True时所有函数不做 jit/pmap覆盖multi_device便于调试。pmap_axis_namemulti_deviceTrue时使用的 pmap 轴名默认kfac_axis注意 docstring 中写的是curvature_axis以代码实际默认值kfac_axis为准。use_jax_cond当前暂未实际使用docstring 注明 Not used for the moment。五、从示例到原理K-FAC 的完整工作流程一次optim.step()内部做了什么结合 optimizer.py 的_step实现其流程为组装函数参数make_func_args按(params, [state], [rng], batch)组装并对 batch 做batch_process_func预处理计算调度值若设置了learning_rate_schedule等则按step_counter计算否则要求显式传入前向与梯度调用value_and_grad_func得到(loss, aux), grads跨设备同步更新曲率估计estimator.update_curvature_matrix_estimate(curvature_ema, 1.0, batch_size, rng, func_args, ...)按周期更新逆step_counter % inverse_update_period 0时调用update_curvature_estimate_inverse提出更新方向propose_directions用multiply_matpower(grads, -1)即乘曲率矩阵的逆得到预条件梯度并可选施加 norm constraint 缩放速度与位置更新delta -lr * preconditioned_grads momentum * velocitiesparams params delta产出统计量statsdict 如上文所述。5.1 自动打标签auto-tagging机制K-FAC 需要知道计算图中每一层的位置才能构造对应的 Kronecker 块。本实现采用图匹配 自动打标签的方式核心在 tag_graph_matcher.pybroadcast_merger先对函数做变换把连续的 broadcast 操作合并简化后续匹配function_to_jax_graph用jax.make_jaxpr追踪函数得到 JAXPR并构建 networkx 有向图nx.DiGraphauto_register_tags提取所有 loss 标签及其祖先子图先收集已被手动层标签标记的参数再用match_pattern在子图上做子图同构匹配命中dense_with_bias、dense_no_bias、conv2d_with_bias、conv2d_no_bias、scale_and_shift、scale_only等预注册模式未被任何模式命中的参数注册为 genericgeneric_tag其曲率用NaiveDiagonal对角近似最终重新构造一个被打上全部标签的包装函数wrapped_auto_registered作为曲率估计的追踪目标。预注册模式的定义位于 tag_graph_matcher.py每个模式都通过register_function注册并指定precedence带偏置的模式 precedence 为 0优先匹配不带偏置的为 1这是因为带偏置的 Dense 图也包含不带偏置的 Dense 子图。5.2 损失注册让优化器看见你的损失要让 K-FAC 计算 Fisher必须把网络的输出损失注册为损失标签。仓库提供两个注册入口均在 loss_functions.pyregister_normal_predictive_distribution(mean, targetsNone, variance0.5, weight1.0)注册一个以mean为均值的高斯预测分布对应平方误差损失weight/(2*var) * ||target - mean||^2。默认variance0.5对应标准平方误差weight * ||target - prediction||^2若损失形式是0.5*coeff*||target - prediction||^2应使用variance1.0。targets仅在需要使用经验 Fisherestimation_modefisher_empirical时才必须提供默认置零。register_squared_error_loss(prediction, targetsNone, weight1.0)平方误差损失的便捷封装内部等价于调用register_normal_predictive_distribution(prediction, targetstargets, variance0.5, weightweight)。在示例脚本中model_loss返回(regularized_loss, dict(mean_squared_error...))并通过jax.value_and_grad(..., has_auxTrue)包装因此Optimizer的value_func_has_auxTrue。对真实应用如 FermiNet你需要在自己的前向函数中用register_normal_predictive_distribution包装输出再让优化器追踪到 loss 标签。注意 loss_functions.py 中的说明这些损失函数不对 batch 求和或取平均evaluate()输出不是标量需要用户自行正确归并。5.3 曲率块的近似策略curvature_blocks.py 定义了多种曲率块每种块把某层参数的曲率矩阵近似为特定结构TwoKroneckerFactored/DenseTwoKroneckerFactored全连接层的标准 Kronecker 分解F ≈ A ⊗ B。块内维护inputs_factor输入相关矩阵x^T x / batch_size与outputs_factor输出梯度相关矩阵dy^T dy / batch_size两个 EMA 因子若有偏置会在输入后拼接一列 1x_one以把偏置纳入 Kronecker 结构见 curvature_blocks.py。求逆使用 pi-adjusted 反演utils.pi_adjusted_inverse把阻尼按1/sqrt(pi)分配到两个因子各自的对角上见 utils.pyNaiveDiagonalgeneric 参数的朴素对角近似diag dy^2 / batch_size求逆只需逐元素除法ScaleAndShiftDiagonalscale/shift如 BN 的缩放与平移参数的对角近似分别估计 scale 与 shift 两路的对角因子ScaleAndShiftFullscale/shift 参数的满矩阵近似所有参数拼接成一个向量后估计完整协方差用 Cholesky 求逆psd_inv_cholesky各块都实现统一的抽象接口init、update_curvature_matrix_estimate、update_curvature_inverse_estimate、multiply_matpower(vec, exp, diagonal_weight)其中exp1表示乘曲率本身exp-1表示乘曲率逆。值得注意的是diagonal_weight l2_reg damping见 estimator.py即 L2 正则与阻尼以对角加性项的形式同时注入矩阵求逆这是代码中对l2_reg参数的核心使用方式。5.4 多设备支持当multi_deviceTrue时或示例脚本的--multi_deviceflag优化器利用jax.pmap把整个训练复制到所有本地设备RNG 通过utils.make_different_rng_key_on_all_devices按 host id fold-in 后拆分保证每设备独立采样pmap_axis_name用于lax.pmean/lax.psum跨设备规约utils.replicate_all_local_devices把超参数复制到每台设备。示例脚本中的random_data生成(num_devices, batch_size, 20)形状的数据配合jax.pmap(model_init)完成多设备初始化见 example.py。六、测试与验证可信度的保证仓库在 tests/ 下提供了两组单元测试graph_matcher_test.py验证图匹配器能否正确把 dense、conv2d、scale-and-shift 等模式从计算图中识别并打上标签tracer_test.py验证 tracer 的 JVP/VJP 与真实jax.jvp/jax.vjp计算结果一致。例如test_tracer_jvp构造带多个损失标签的自编码器autoencoder_aux注册了两个权重不同的 normal predictive distribution 损失比较 tracer 得到的损失切线方向与手写切线是否 allclosertol/atol 均为 1e-5见 tracer_test.py。这些测试从侧面印证了自动打标签与曲率矩阵-向量积实现的数值正确性是理解该模块内部机制时很好的阅读材料。运行测试cd kfac_ferminet_alpha python3 -m unittest discover -s tests七、FAQ 与常见坑Q1为什么必须让l2_reg与损失中的正则系数一致因为曲率块求逆时统一使用diagonal_weight l2_reg damping注入对角项estimator.py若两者不一致预条件矩阵的对角修正会与实际损失梯度不匹配影响收敛。Q2fisher_empirical为什么报NotImplementedError当前仓库的 estimator.py 中该分支尚未实现这是仓库现状如需使用请等待上游更新或自行实现。Q3如何接入自己的模型你需要提供(1) 返回(loss, aux)与梯度的value_and_grad_func(2) 在损失前调用register_normal_predictive_distribution或register_squared_error_loss注册损失标签(3) 按value_func_has_state/value_func_has_rng如实声明函数签名形态。优化器会在首次step()时自动完成追踪、打标签与最终化finalize见 optimizer.py。Q4示例脚本中的模型结构可否调整可以。model_init的encoder_sizes参数决定网络宽度但注意model_loss中if i % 4 ! 3的激活判断与每 4 层为一组3 个 tanh 1 个线性的固定结构绑定修改层数时需要同步调整该判断。Q5什么是 burn-in为什么第一步前要预热K-FAC 的第一步更新需要可用的曲率逆因此在真正的参数更新前先用若干 mini-batch 纯更新曲率估计num_burnin_steps默认 10让协方差估计足够稳定避免初始噪声导致方向失真。这也是step()中step_counter_int 0分支存在的意义。八、延伸阅读论文原文Better, Faster Fermionic Neural NetworksJames S. Spencer, David Pfau, Aleksandar Botev, W. M. C. FoulkesarXiv:2011.07125——本模块的配套论文K-FAC 理论来源Optimizing Neural Networks with Kronecker-factored Approximate CurvatureJames Martens, Roger GrossearXiv:1503.05671完整示例kfac_ferminet_alpha/example.py一键安装脚本kfac_ferminet_alpha/run.sh更大型的端到端用例可参考 README 中指向的 FermiNet 项目https://github.com/deepmind/ferminet/其中使用本模块训练费米子神经网络波函数。最后需要说明按 README.md 的声明这是纯研究代码不提供后续支持承诺也不保证向后兼容使用时请以当前仓库中的源码为准。赞分享人工智能深度学习机器学习计算机视觉NLP强化学习【免费下载链接】deepmind-researchThis repository contains implementations and illustrative code to accompany DeepMind publications项目地址https://gitcode.com/gh_mirrors/de/deepmind-research点击查看免费下载相关推荐modded-nanogpt 优化基准中的 PSGD 基线Kronecker 白化预条件器与 Hyperball 的完整实现modded nanogpt 优化基准中的 PSGD 基线Kronecker 白化预条件器与 Hyperball 的完整实现 本文围绕 modded nano人工智能大模型预训练分布式训练模型优化深度学习5 分钟跑通 OpenVINOAI 推理优化与本地部署完整指南5 分钟跑通 OpenVINOAI 推理优化与本地部署完整指南 OpenVINO 是英特尔开源的 AI 推理优化与部署工具包覆盖 Windows、Linux人工智能推理引擎深度学习本地部署模型优化模型量化PaDIR 实战指南基于 T5X/JAX 的非自回归并行解码器实现与配置PaDIR 实战指南基于 T5X/JAX 的非自回归并行解码器实现与配置 PaDIR Pa rallel D ecoding by I terative R人工智能深度学习NLP计算机视觉强化学习上一篇CANN graph-autofusion 中 MatmulElemwise 的 CV 类算子融合AIC 与 AIV 混合执行的自动融合设计与实现下一篇高效解决ncm格式限制的开源音频转换工具NCMconverter全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。