ops-nn算子库深度解析:昇腾神经网络计算的基础

前言

在AI技术高速发展的当下,神经网络模型的复杂度与计算量呈指数级增长,对底层计算架构的算力支撑和优化能力提出了极高要求。CANN(Compute Architecture for Neural Networks)作为华为面向AI场景打造的异构计算架构,是昇腾AI处理器发挥极致算力的核心支撑,而ops-nn作为CANN生态中核心的神经网络类计算算子库,更是昇腾平台实现神经网络高效计算的底层基础。ops-nn为昇腾硬件量身打造了覆盖CNN、DNN、RNN等主流神经网络的核心计算算子,通过底层硬件级优化和标准化封装,让上层AI框架与应用能够充分利用昇腾的多核并行、异构计算优势,成为昇腾神经网络计算体系中不可或缺的核心组件。

本文以CANN仓库为背景,对ops-nn算子库进行全方位深度解析,从其在昇腾计算体系中的定位、核心特性、技术架构出发,结合实操代码展示算子的调用与基础扩展方法,让开发者深入理解ops-nn如何为昇腾神经网络计算筑牢基础,同时掌握基于该算子库进行昇腾平台AI开发的核心方法。

一、ops-nn算子库在昇腾CANN体系中的核心定位

昇腾AI计算体系的核心是通过CANN架构实现"框架层-计算层-硬件层"的无缝衔接,而算子作为AI计算的最小执行单元,是连接CANN架构与神经网络模型的关键纽带。ops-nn算子库作为CANN官方专为神经网络场景打造的算子集合,在昇腾计算体系中承担着神经网络计算标准化实现昇腾硬件算力高效释放的双重核心作用。

从架构层级来看,ops-nn处于CANN架构的计算算子层,上接GE(Graph Engine)图编译器,承接PyTorch、TensorFlow等上层AI框架解析后的计算图任务,下连昇腾AI处理器的硬件计算核心,将神经网络的抽象计算逻辑转化为适配昇腾硬件的可执行指令。与CANN生态中的ops-math(数学基础算子)、ops-cv(图像处理算子)、ops-transformer(大模型算子)等仓库形成互补,ops-nn聚焦于通用神经网络的基础计算需求,覆盖了神经网络从特征提取、特征融合到激活输出的全流程核心算子,是昇腾平台开发各类神经网络模型的基础依赖。

从实际应用来看,无论是传统的CNN图像识别模型、RNN序列建模模型,还是基于昇腾进行轻量化部署的定制化神经网络,其底层的卷积、池化、激活、全连接等核心计算,均由ops-nn算子库提供高性能实现。可以说,ops-nn是昇腾神经网络计算的"基石",其算子的性能、兼容性与扩展性,直接决定了昇腾平台上神经网络模型的训练与推理效率。

二、ops-nn算子库的核心特性与技术架构

2.1 核心技术特性

ops-nn算子库以C++为主要开发语言(占比91.84%),辅以CMake、C、Python等完成工程构建与轻量封装,针对昇腾AI处理器的硬件特性做了深度优化,具备四大核心技术特性,完美适配神经网络计算需求:

  1. 硬件级深度优化:算子底层实现充分适配昇腾AI处理器的多核并行、众核计算架构,通过指令级优化、内存访问优化、计算任务分片调度,最大化发挥昇腾硬件的计算潜力,相比通用CPU实现,算子执行效率提升数倍甚至数十倍;
  2. 全流程神经网络算子覆盖:实现了卷积、反卷积、池化(最大/平均/自适应)、激活(ReLU/Leaky ReLU/Sigmoid/GELU)、全连接、批量归一化、Dropout等神经网络全流程核心算子,满足绝大多数通用神经网络的开发需求;
  3. 多精度与多维度兼容:支持float16、float32、int8等多种数据精度,适配不同精度需求的神经网络开发场景(如float16用于推理轻量化,float32用于训练高精度);同时支持标量、向量、张量等多维度计算,兼容从2D卷积到高维特征图的各类计算逻辑;
  4. CANN生态深度协同:无缝对接CANN的GE图编译器、runtime运行时组件、asc-devkit算子开发工具包,算子可被GE自动优化、调度并纳入计算图,同时支持基于asc-devkit进行自定义算子扩展,与CANN生态形成完整的开发闭环;
  5. 工程化与易用性兼顾:采用CMake标准化构建流程,提供清晰的分层API接口,同时支持Python轻量封装,兼顾底层高性能开发与上层快速集成调试,降低昇腾平台神经网络开发的门槛。

2.2 整体技术架构

ops-nn算子库采用分层解耦的技术架构,整体分为接口层、核心计算层、硬件适配层三层,各层职责清晰、低耦合高内聚,既保证了算子的高性能实现,又为扩展与维护提供了便利:

  1. 接口层:位于算子库最上层,提供C/C++标准化的算子调用接口,同时封装轻量的Python API,开发者可直接通过接口调用各类神经网络算子,无需关注底层实现细节;该层还提供算子的初始化、资源管理、参数校验等通用能力;
  2. 核心计算层:算子库的核心层,实现了各类神经网络算子的核心计算逻辑,包含卷积计算模块、池化模块、激活模块、全连接模块等;该层基于昇腾的并行计算规范,实现了算子的并行化计算,同时完成数据的格式转换、维度适配等处理;
  3. 硬件适配层:位于算子库最底层,直接对接昇腾AI处理器的硬件驱动与计算核心,完成计算任务的硬件分配、指令下发、结果回收;该层屏蔽了昇腾硬件的底层差异,为上层计算层提供统一的硬件访问接口,确保算子在昇腾不同硬件型号上的兼容性。

三层架构自上而下形成了"调用-计算-执行"的完整链路,同时各层之间通过标准化接口通信,开发者可基于接口层快速调用算子,也可基于核心计算层与硬件适配层进行自定义算子的扩展开发。

三、ops-nn算子库的环境搭建与基础调用

在昇腾平台基于ops-nn算子库进行开发前,需先完成CANN基础环境与ops-nn仓库的搭建集成,以下为Linux环境下的标准流程,同时结合基础的卷积算子调用,展示ops-nn算子的基础使用方法。

3.1 开发环境搭建

3.1.1 前置条件

已完成昇腾CANN SDK的安装与环境变量配置,确保ASCEND_TOOLKIT_HOME环境变量指向CANN安装目录,同时安装GCC(7.5及以上)、CMake(3.18及以上)、Git等基础开发工具。

3.1.2 仓库拉取与编译安装
bash 复制代码
# 克隆ops-nn仓库(关联CANN官方仓库)
git clone https://gitcode.com/cann/ops-nn.git
# 进入仓库目录
cd ops-nn
# 创建构建目录
mkdir build && cd build
# CMake配置:关联昇腾CANN环境
cmake .. \
  -DCMAKE_CXX_COMPILER=g++ \
  -DCMAKE_BUILD_TYPE=Release \
  -DASCEND_TOOLKIT_HOME=$ASCEND_TOOLKIT_HOME
# 多线程编译(根据硬件资源调整-j参数)
make -j8
# 安装库文件与头文件至CANN环境目录
make install
3.1.3 环境验证

验证ops-nn算子库是否成功集成至昇腾CANN环境,确保头文件与库文件可正常被识别:

bash 复制代码
# 检查ops-nn核心头文件是否存在
ls $ASCEND_TOOLKIT_HOME/include/ops_nn/
# 检查编译后的ops-nn库文件是否存在
ls $ASCEND_TOOLKIT_HOME/lib64/libops_nn.so

3.2 ops-nn核心算子基础调用:卷积算子实战

卷积算子是CNN模型的核心计算算子,也是ops-nn算子库中优化最为深入的算子之一。以下通过C++代码实现基于ops-nn的二维卷积算子调用,模拟CNN模型中的特征提取过程,展示ops-nn算子的基础调用流程。

3.2.1 卷积算子调用核心代码
cpp 复制代码
#include <iostream>
#include <vector>
#include "ops_nn/conv2d.h"  // 引入ops-nn二维卷积算子头文件
#include "cann/base/tensor.h"  // 昇腾CANN标准张量数据结构

// 定义卷积计算参数(模拟CNN第一层卷积:输入3通道,输出16通道,卷积核3x3,步长1,填充1)
const int BATCH = 1;        // 批量大小
const int IN_CHANNEL = 3;   // 输入通道数
const int OUT_CHANNEL = 16; // 输出通道数
const int IMG_H = 224;      // 输入图像高度
const int IMG_W = 224;      // 输入图像宽度
const int KERNEL_H = 3;     // 卷积核高度
const int KERNEL_W = 3;     // 卷积核宽度
const int STRIDE_H = 1;     // 垂直步长
const int STRIDE_W = 1;     // 水平步长
const int PAD_H = 1;        // 垂直填充
const int PAD_W = 1;        // 水平填充

int main() {
    // 1. 初始化二维卷积算子,适配昇腾CANN执行环境
    ops_nn::Conv2d conv2d_op;
    conv2d_op.Init(IN_CHANNEL, OUT_CHANNEL, KERNEL_H, KERNEL_W,
                   STRIDE_H, STRIDE_W, PAD_H, PAD_W);

    // 2. 准备输入数据:输入特征图 + 卷积核权重 + 偏置
    std::vector<float> input_data(BATCH * IN_CHANNEL * IMG_H * IMG_W);
    std::vector<float> weight_data(OUT_CHANNEL * IN_CHANNEL * KERNEL_H * KERNEL_W);
    std::vector<float> bias_data(OUT_CHANNEL);

    // 随机初始化数据(模拟图像特征与卷积核权重)
    for (int i = 0; i < input_data.size(); ++i) {
        input_data[i] = static_cast<float>(rand()) / RAND_MAX;
    }
    for (int i = 0; i < weight_data.size(); ++i) {
        weight_data[i] = static_cast<float>(rand()) / RAND_MAX;
    }
    for (int i = 0; i < bias_data.size(); ++i) {
        bias_data[i] = static_cast<float>(rand()) / RAND_MAX * 0.1;
    }

    // 3. 构建昇腾CANN标准张量,对接ops-nn算子输入输出格式
    cann::Tensor input_tensor, weight_tensor, bias_tensor, output_tensor;
    // 配置输入特征图张量
    input_tensor.SetShape({BATCH, IN_CHANNEL, IMG_H, IMG_W});
    input_tensor.SetDataType(cann::DataType::FLOAT32);
    input_tensor.SetData(input_data.data(), input_data.size() * sizeof(float));
    // 配置卷积核权重张量
    weight_tensor.SetShape({OUT_CHANNEL, IN_CHANNEL, KERNEL_H, KERNEL_W});
    weight_tensor.SetDataType(cann::DataType::FLOAT32);
    weight_tensor.SetData(weight_data.data(), weight_data.size() * sizeof(float));
    // 配置偏置张量
    bias_tensor.SetShape({OUT_CHANNEL});
    bias_tensor.SetDataType(cann::DataType::FLOAT32);
    bias_tensor.SetData(bias_data.data(), bias_data.size() * sizeof(float));

    // 4. 执行二维卷积计算(基于ops-nn的硬件优化实现)
    conv2d_op.Compute(input_tensor, weight_tensor, bias_tensor, output_tensor);
    std::cout << "二维卷积计算完成,输出特征图维度:" << std::endl;
    std::vector<int> output_shape = output_tensor.GetShape();
    for (int dim : output_shape) {
        std::cout << dim << " ";
    }
    std::cout << std::endl;

    // 5. 释放算子与张量资源(遵循昇腾CANN资源管理规范)
    conv2d_op.Destroy();
    input_tensor.FreeData();
    weight_tensor.FreeData();
    bias_tensor.FreeData();
    output_tensor.FreeData();

    std::cout << "ops-nn卷积算子调用执行完成!" << std::endl;
    return 0;
}
3.2.2 工程构建配置(CMakeLists.txt)
cmake 复制代码
cmake_minimum_required(VERSION 3.18)
project(ops_nn_conv2d_demo)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Release)

# 配置昇腾CANN与ops-nn头文件路径
include_directories($ENV{ASCEND_TOOLKIT_HOME}/include)
include_directories($ENV{ASCEND_TOOLKIT_HOME}/include/ops_nn)

# 配置昇腾CANN与ops-nn库文件路径
link_directories($ENV{ASCEND_TOOLKIT_HOME}/lib64)

# 添加可执行文件
add_executable(conv2d_demo conv2d_demo.cpp)

# 链接ops-nn库与昇腾CANN基础库
target_link_libraries(conv2d_demo ops_nn cann_base pthread)
3.2.3 编译与运行
bash 复制代码
# 创建构建目录
mkdir build && cd build
# CMake配置
cmake ..
# 编译项目
make -j4
# 运行演示程序
./conv2d_demo
3.2.4 运行结果说明

程序执行后会输出卷积计算后的特征图维度,因配置了步长1、填充1,输出特征图的尺寸与输入一致,示例输出如下:

复制代码
二维卷积计算完成,输出特征图维度:
1 16 224 224 
ops-nn卷积算子调用执行完成!

该示例完整展示了ops-nn核心算子的基础调用流程,基于昇腾CANN的标准张量数据结构,实现了CNN模型中核心的卷积计算,而底层的硬件优化、并行计算均由ops-nn算子库自动完成,开发者无需关注昇腾硬件的底层细节。

四、基于ops-nn算子库的自定义算子扩展开发

在昇腾平台的实际神经网络开发中,针对一些定制化的业务场景(如自定义激活函数、特殊卷积操作),ops-nn原生算子可能无法满足需求,此时可基于ops-nn的扩展框架进行自定义神经网络算子开发。ops-nn提供了标准化的算子扩展接口,遵循昇腾CANN的算子开发规范,让开发者能够快速实现自定义算子,并无缝集成至昇腾的计算图中。

4.1 自定义算子开发核心规范

基于ops-nn开发自定义神经网络算子,需遵循昇腾CANN算子开发规范ops-nn库内开发标准,核心规范如下:

  1. 继承ops-nn的基础算子基类OpBase,实现统一的Init()(算子初始化)、Compute()(核心计算)、Destroy()(资源释放)接口;
  2. 使用昇腾CANN标准的cann::Tensor作为输入输出数据结构,确保与CANN生态的内存管理、任务调度兼容;
  3. 自定义算子的底层计算需适配昇腾AI处理器的并行计算特性,尽量采用数据并行方式,提升算子执行效率;
  4. 遵循ops-nn的代码风格与工程化规范,使用CMake进行构建,确保自定义算子可无缝集成至ops-nn库或自有项目。

4.2 实战:自定义Swish激活算子开发

Swish激活函数是一种平滑的非线性激活函数,公式为Swish(x)=x∗sigmoid(βx)Swish(x) = x * sigmoid(\beta x)Swish(x)=x∗sigmoid(βx),在部分神经网络模型中表现优于ReLU,而若ops-nn原生未提供该算子,可基于ops-nn进行自定义开发,以下为完整的开发流程。

4.2.1 自定义算子头文件(custom_swish.h)
cpp 复制代码
#ifndef CUSTOM_SWISH_H
#define CUSTOM_SWISH_H

#include "ops_nn/op_base.h"  // 引入ops-nn基础算子基类
#include "cann/base/tensor.h"  // 昇腾CANN标准张量
#include "ops_nn/activation/sigmoid.h"  // 复用ops-nn的Sigmoid算子

namespace ops_nn {
namespace custom {

// 自定义Swish激活算子,继承ops-nn基础算子基类
class Swish : public OpBase {
public:
    // 初始化:配置beta参数(默认1.0)
    void Init(float beta = 1.0f) override;
    // 核心计算逻辑:实现Swish激活
    void Compute(const cann::Tensor& input, cann::Tensor& output) override;
    // 资源释放:释放算子与依赖资源
    void Destroy() override;

private:
    float beta_;  // Swish算子beta参数
    Sigmoid sigmoid_op_;  // 复用ops-nn的Sigmoid算子
};

}  // namespace custom
}  // namespace ops_nn

#endif // CUSTOM_SWISH_H
4.2.2 自定义算子核心实现(custom_swish.cpp)
cpp 复制代码
#include "custom_swish.h"
#include <cmath>

namespace ops_nn {
namespace custom {

void Swish::Init(float beta) {
    beta_ = beta;
    // 初始化复用的Sigmoid算子
    sigmoid_op_.Init();
    // 调用父类初始化,分配CANN计算资源
    OpBase::Init();
}

void Swish::Compute(const cann::Tensor& input, cann::Tensor& output) {
    // 1. 获取输入张量信息
    const std::vector<int>& input_shape = input.GetShape();
    int total_elems = input.GetElementNum();
    float* input_data = static_cast<float*>(input.GetData());

    // 2. 初始化输出张量,与输入维度、类型一致
    output.SetShape(input_shape);
    output.SetDataType(cann::DataType::FLOAT32);
    output.AllocData();
    float* output_data = static_cast<float*>(output.GetData());

    // 3. 构建beta*x的中间张量
    cann::Tensor beta_x_tensor;
    beta_x_tensor.SetShape(input_shape);
    beta_x_tensor.SetDataType(cann::DataType::FLOAT32);
    beta_x_tensor.AllocData();
    float* beta_x_data = static_cast<float*>(beta_x_tensor.GetData());
    for (int i = 0; i < total_elems; ++i) {
        beta_x_data[i] = input_data[i] * beta_;
    }

    // 4. 复用ops-nn的Sigmoid算子计算sigmoid(beta*x)
    cann::Tensor sigmoid_out_tensor;
    sigmoid_op_.Compute(beta_x_tensor, sigmoid_out_tensor);
    float* sigmoid_data = static_cast<float*>(sigmoid_out_tensor.GetData());

    // 5. 计算Swish激活:x * sigmoid(beta*x)
    for (int i = 0; i < total_elems; ++i) {
        output_data[i] = input_data[i] * sigmoid_data[i];
    }

    // 6. 释放中间张量资源
    beta_x_tensor.FreeData();
    sigmoid_out_tensor.FreeData();
}

void Swish::Destroy() {
    // 释放Sigmoid算子资源
    sigmoid_op_.Destroy();
    // 释放父类资源
    OpBase::Destroy();
}

}  // namespace custom
}  // namespace ops_nn
4.2.3 自定义算子测试代码(swish_demo.cpp)
cpp 复制代码
#include <iostream>
#include <vector>
#include "custom_swish.h"
#include "cann/base/tensor.h"

// 定义测试参数:模拟batch=2,通道=64,特征图32x32
const int BATCH = 2;
const int CHANNEL = 64;
const int H = 32;
const int W = 32;

int main() {
    // 1. 初始化自定义Swish算子
    ops_nn::custom::Swish swish_op;
    swish_op.Init(1.0f);
    std::cout << "自定义Swish算子初始化完成!" << std::endl;

    // 2. 准备输入数据(随机初始化,模拟神经网络特征图)
    int total_elems = BATCH * CHANNEL * H * W;
    std::vector<float> input_data(total_elems);
    for (int i = 0; i < total_elems; ++i) {
        input_data[i] = static_cast<float>(rand()) / RAND_MAX * 4 - 2; // 生成[-2,2]的随机数
    }

    // 3. 构建CANN张量
    cann::Tensor input_tensor, output_tensor;
    input_tensor.SetShape({BATCH, CHANNEL, H, W});
    input_tensor.SetDataType(cann::DataType::FLOAT32);
    input_tensor.SetData(input_data.data(), input_data.size() * sizeof(float));

    // 4. 执行Swish计算
    swish_op.Compute(input_tensor, output_tensor);

    // 5. 验证计算结果(输出前10个元素)
    float* output_data = static_cast<float*>(output_tensor.GetData());
    std::cout << "Swish激活计算结果(前10个元素):" << std::endl;
    for (int i = 0; i < 10; ++i) {
        std::cout << "input[" << i << "] = " << input_data[i]
                  << ", output[" << i << "] = " << output_data[i] << std::endl;
    }

    // 6. 释放资源
    swish_op.Destroy();
    input_tensor.FreeData();
    output_tensor.FreeData();

    std::cout << "\n自定义Swish算子测试完成!" << std::endl;
    return 0;
}
4.2.4 编译配置与运行

修改CMakeLists.txt,添加自定义算子的编译配置:

cmake 复制代码
cmake_minimum_required(VERSION 3.18)
project(custom_swish_demo)
set(CMAKE_CXX_STANDARD 17)

# 头文件路径
include_directories($ENV{ASCEND_TOOLKIT_HOME}/include)
include_directories($ENV{ASCEND_TOOLKIT_HOME}/include/ops_nn)
include_directories(${CMAKE_SOURCE_DIR})

# 库文件路径
link_directories($ENV{ASCEND_TOOLKIT_HOME}/lib64)

# 添加可执行文件
add_executable(swish_demo 
    swish_demo.cpp
    custom_swish.cpp
)

# 链接依赖库
target_link_libraries(swish_demo ops_nn cann_base pthread)

执行编译与运行命令,即可验证自定义Swish算子的功能正确性:

bash 复制代码
mkdir build && cd build
cmake .. && make -j4
./swish_demo

该示例中,自定义Swish算子不仅遵循了ops-nn与昇腾CANN的开发规范,还复用了ops-nn原生的Sigmoid算子,减少了重复开发,同时确保了算子与CANN生态的深度兼容,可直接应用于昇腾平台的神经网络开发中。

五、ops-nn算子库的性能优化与最佳实践

基于ops-nn算子库在昇腾平台进行神经网络开发时,要充分发挥算子库与昇腾硬件的性能优势,需结合实际场景进行针对性优化,以下为核心的性能优化技巧与最佳实践:

5.1 核心性能优化技巧

  1. 合理选择数据精度:在满足业务精度需求的前提下,优先使用float16精度进行模型推理,相比float32,float16可减少一半的内存占用,提升昇腾硬件的计算与数据传输效率;训练阶段可采用混合精度训练,结合float32与float16,兼顾精度与效率;
  2. 算子融合优化:将连续的多个算子(如卷积+批归一化+激活)融合为单个复合算子,减少中间数据的内存存储与传输开销,可基于ops-nn的算子融合接口或GE图编译器的自动融合功能实现;
  3. 内存布局优化:遵循昇腾CANN的张量内存布局规范(如NCHW格式),减少数据格式转换的开销,同时利用ops-nn的内存复用接口,避免不必要的内存分配与释放;
  4. 批量计算优化:尽量采用大批次的输入数据进行计算,充分利用昇腾硬件的多核并行计算能力,提升算子的计算效率,避免小批次数据导致的硬件资源利用率不足;
  5. 自定义算子硬件优化:开发自定义算子时,充分利用昇腾的众核计算架构,将计算任务按数据维度分片,分配至不同的计算核心并行执行,减少单核心的计算压力。

5.2 最佳实践

  1. 优先使用ops-nn原生算子:ops-nn原生算子经过华为官方的深度硬件优化,性能远优于开发者自行实现的基础算子,开发时应优先复用原生算子,仅在定制化场景下进行自定义算子开发;
  2. 结合GE图编译器进行整体优化:将ops-nn算子的调用与GE图编译器结合,通过GE的计算图优化、多流并行、内存复用等能力,实现整个神经网络模型的全局优化,而非单独优化某个算子;
  3. 基于asc-devkit进行算子调优:对于性能要求极高的自定义算子,可借助昇腾asc-devkit算子开发工具包进行指令级、硬件级的调优,提升算子的执行效率;
  4. 充分利用ops-nn的工程化能力:基于ops-nn的标准化构建流程与测试框架,对开发的算子进行充分的功能测试与性能测试,确保算子的正确性与高性能。

六、总结

ops-nn算子库作为昇腾CANN生态的核心神经网络计算组件,是昇腾平台实现神经网络高效计算的底层基础,其为昇腾AI处理器量身打造了覆盖神经网络全流程的核心算子,通过硬件级深度优化、CANN生态深度协同、标准化的扩展接口,让开发者能够快速、高效地在昇腾平台进行各类神经网络模型的开发、部署与优化。

本文从ops-nn算子库在昇腾CANN体系中的核心定位出发,解析了其核心技术特性与分层技术架构,通过卷积算子基础调用、自定义Swish算子开发等实战代码,展示了算子库的基础使用与扩展开发方法,同时给出了性能优化技巧与最佳实践。对于昇腾平台的AI开发者而言,深入理解并灵活运用ops-nn算子库,是解锁昇腾AI处理器算力、开发高性能神经网络模型的关键。

未来,随着昇腾CANN架构的持续升级与神经网络技术的不断发展,ops-nn算子库也将不断丰富算子种类、深化硬件优化、简化开发接口,进一步覆盖大模型、多模态模型等新型神经网络的计算需求,为昇腾平台在各类AI场景的落地提供更加强大的神经网络计算支撑,持续筑牢昇腾神经网络计算的基础。

cann组织链接:https://gitcode.com/cann

ops-nn仓库链接:https://gitcode.com/cann/ops-nn

相关推荐
程序员猫哥_2 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
禁默2 小时前
Ops-Transformer:CANN生态赋能AIGC的Transformer专用加速库
深度学习·aigc·transformer·cann
哈__2 小时前
CANN优化Diffusion扩散模型推理:去噪过程与采样策略加速
人工智能
永远都不秃头的程序员(互关)2 小时前
CANN DVPP赋能AIGC:硬件加速视觉处理,打造极致生成式视觉工作流
人工智能·aigc
JustDI-CM2 小时前
AI学习笔记-提示词工程
人工智能·笔记·学习
悟纤2 小时前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
饭饭大王6662 小时前
迈向智能体时代——构建基于 `ops-transformer` 的可持续 AI 系统
人工智能·深度学习·transformer
晚霞的不甘2 小时前
CANN 支持强化学习:从 Isaac Gym 仿真到机械臂真机控制
人工智能·神经网络·架构·开源·音视频
熊文豪2 小时前
从CANN到ops-nn:循环神经网络RNN算子实战
cann·ops-nn