当前位置: 首页 > news >正文

免费申请手机网站wordpress 查询页面

免费申请手机网站,wordpress 查询页面,小明之家网页制作html,境外建网站第一章 问题的诞生——深度学习部署的硬件困境 1.1 计算图的理想化抽象 什么是计算图#xff1f; 想象你正在组装乐高积木。每个积木块代表一个数学运算#xff08;如加法、乘法#xff09;#xff0c;积木之间的连接代表数据流动。深度学习框架正是用这种积木拼接…第一章 问题的诞生——深度学习部署的硬件困境 1.1 计算图的理想化抽象 什么是计算图 想象你正在组装乐高积木。每个积木块代表一个数学运算如加法、乘法积木之间的连接代表数据流动。深度学习框架正是用这种积木拼接的方式构建神经网络这种形式化表达称为计算图Computational Graph。 代码解析一个真实的神经网络 # 导入PyTorch深度学习框架 import torch import torch.nn as nn# 定义卷积神经网络类继承自nn.Module基类 class CNN(nn.Module):def __init__(self):super().__init__() # 初始化父类# 定义网络层类似乐高积木的组件self.conv1 nn.Conv2d( # 2D卷积层in_channels3, # 输入通道数RGB图像为3通道out_channels64, # 输出通道数即卷积核数量kernel_size3 # 卷积核尺寸3x3)self.relu nn.ReLU() # 激活函数层使网络具有非线性self.fc nn.Linear( # 全连接层即Dense层in_features512, # 输入特征维度out_features10 # 输出类别数假设是10分类问题)# 定义数据前向传播路径描述数据如何流过各层def forward(self, x):x self.conv1(x) # 输入数据经过卷积层x self.relu(x) # 通过ReLU激活函数x x.view(x.size(0), -1) # 展平操作将4D张量转为2Dx self.fc(x) # 通过全连接层return x # 返回最终输出对应的数据流图如下括号内为张量形状 输入图像(batch,3,224,224)↓ Conv2D层 → 输出(batch,64,222,222) ↓ ReLU激活 → 输出(batch,64,222,222)↓ Flatten展平 → 输出(batch,64*222*2223175072)↓ Dense全连接 → 输出(batch,10)关键理解计算图只描述要做什么What to do而不关心如何做How to do。 1.2 硬件现实的多样性挑战 硬件特性对比表扩展解析 硬件类型计算单元内存层次结构适合场景GPU数千个流处理器全局内存大容量高延迟共享缓存低延迟小容量并行处理大批量数据CPU多核通常4-64核L1/L2/L3多级缓存平衡延迟和容量复杂逻辑控制流NPU专用矩阵乘法单元片上内存超低延迟但容量受限特定神经网络运算加速FPGA可编程逻辑门阵列分布式Block RAM灵活但容量小定制化计算加速 三大核心问题详解 问题1算子实现差异 以卷积运算为例不同硬件需要完全不同的实现方式 GPU实现CUDA伪代码 __global__ void conv2d_gpu(float* input, float* kernel, float* output) {int bid blockIdx.x; // 批量索引int tid threadIdx.x; // 线程索引// 每个线程计算输出特征图的一个像素float sum 0;for(int c0; cin_channels; c){for(int i0; i3; i){for(int j0; j3; j){sum input[bid][c][tid_xi][tid_yj] * kernel[c][i][j];}}}output[bid][tid] sum; }CPU优化实现C SIMD伪代码 void conv2d_cpu(float* input, float* kernel, float* output) {#pragma omp parallel for // 多核并行for(int b0; bbatch; b){for(int c0; cchannels; c){__m256 simd_accum; // AVX256向量寄存器for(int i0; iheight; i8){ // 8元素向量处理simd_accum _mm256_load_ps(input[b][c][i]);// 向量化乘加运算simd_accum _mm256_fmadd_ps(simd_accum, kernel_vec, simd_accum);_mm256_store_ps(output[b][c][i], simd_accum);}}} }问题2内存访问模式冲突 不同硬件对内存访问的敏感性 GPU内存墙RTX 3090显存带宽936GB/s但需要连续访问才能达到峰值性能。若数据布局不合理实际带宽利用率可能不足30%。 # 不良内存布局通道最后 tensor torch.randn(224, 224, 3) # HWC格式 # GPU更偏好通道优先布局 tensor tensor.permute(2, 0, 1) # CHW格式CPU缓存行现代CPU缓存行通常为64字节。假设处理float32数据4字节/元素每次缓存加载可获取16个连续元素。非连续访问会导致缓存频繁失效。 问题3计算精度陷阱 常见精度问题案例 # 训练时使用FP32精度 model.train() output model(fp32_input)# 部署时误用FP16 model.half() # 转换为FP16 output model(fp16_input) # 可能溢出或精度不足不同硬件的精度支持差异 硬件类型FP32支持FP16支持INT8量化GPU完整TensorCore加速需要特殊指令NPU部分主要支持专用加速单元手机SoC有限可选主流方案 1.3 早期解决方案的局限 人工优化库的工作流程 #mermaid-svg-tjZ6N9Za3B6xYkeD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .error-icon{fill:#552222;}#mermaid-svg-tjZ6N9Za3B6xYkeD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tjZ6N9Za3B6xYkeD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .marker.cross{stroke:#333333;}#mermaid-svg-tjZ6N9Za3B6xYkeD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tjZ6N9Za3B6xYkeD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .cluster-label text{fill:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .cluster-label span{color:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .label text,#mermaid-svg-tjZ6N9Za3B6xYkeD span{fill:#333;color:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .node rect,#mermaid-svg-tjZ6N9Za3B6xYkeD .node circle,#mermaid-svg-tjZ6N9Za3B6xYkeD .node ellipse,#mermaid-svg-tjZ6N9Za3B6xYkeD .node polygon,#mermaid-svg-tjZ6N9Za3B6xYkeD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tjZ6N9Za3B6xYkeD .node .label{text-align:center;}#mermaid-svg-tjZ6N9Za3B6xYkeD .node.clickable{cursor:pointer;}#mermaid-svg-tjZ6N9Za3B6xYkeD .arrowheadPath{fill:#333333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tjZ6N9Za3B6xYkeD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-tjZ6N9Za3B6xYkeD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-tjZ6N9Za3B6xYkeD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tjZ6N9Za3B6xYkeD .cluster text{fill:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD .cluster span{color:#333;}#mermaid-svg-tjZ6N9Za3B6xYkeD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tjZ6N9Za3B6xYkeD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} GPU CPU 算法工程师 编写Python模型 选择目标硬件 调用cuDNN 调用MKL 部署 典型案例卷积算子的多平台实现 假设需要新增一种Dilated Conv空洞卷积 平台开发工作内容耗时估算NVIDIA GPU编写CUDA内核并优化内存访问3人周Intel CPU实现AVX512向量化版本2人周ARM Mali适配OpenCL内核2.5人周华为NPU转换为AscendCL专用指令3人周 总成本约10人周2.5个月且需持续维护多个代码库。 人工优化的两大缺陷 缺陷1算子实现碎片化 假设某框架有200个算子支持5种硬件平台 总维护量 200算子 × 5平台 1000个实现版本当新增一个算子时 新增工作量 1算子 × 5平台 5个实现版本缺陷2跨算子优化缺失 考虑如下计算图 Conv → ReLU → Add人工优化可能得到 # 三个独立内核 conv_out cudnn.conv(input) relu_out cudnn.relu(conv_out) output cudnn.add(relu_out, residual)而编译器可进行算子融合优化 # 单个融合内核 output cudnn.fused_conv_relu_add(input, residual)优化后的收益 内核启动开销减少至1/3中间结果内存占用降低1/2数据访存次数减少至2/5 小结编译器为何必须存在 通过一个现实案例理解必要性 场景某公司开发人脸识别系统需在以下设备部署 云端NVIDIA A100 GPU边缘端Intel i7-11800H CPU终端华为Mate 40手机NPU 传统方式 #mermaid-svg-EBg6Sw5oCWRo1xfE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .error-icon{fill:#552222;}#mermaid-svg-EBg6Sw5oCWRo1xfE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EBg6Sw5oCWRo1xfE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .marker.cross{stroke:#333333;}#mermaid-svg-EBg6Sw5oCWRo1xfE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EBg6Sw5oCWRo1xfE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .cluster-label text{fill:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .cluster-label span{color:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .label text,#mermaid-svg-EBg6Sw5oCWRo1xfE span{fill:#333;color:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .node rect,#mermaid-svg-EBg6Sw5oCWRo1xfE .node circle,#mermaid-svg-EBg6Sw5oCWRo1xfE .node ellipse,#mermaid-svg-EBg6Sw5oCWRo1xfE .node polygon,#mermaid-svg-EBg6Sw5oCWRo1xfE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EBg6Sw5oCWRo1xfE .node .label{text-align:center;}#mermaid-svg-EBg6Sw5oCWRo1xfE .node.clickable{cursor:pointer;}#mermaid-svg-EBg6Sw5oCWRo1xfE .arrowheadPath{fill:#333333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EBg6Sw5oCWRo1xfE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-EBg6Sw5oCWRo1xfE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-EBg6Sw5oCWRo1xfE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EBg6Sw5oCWRo1xfE .cluster text{fill:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE .cluster span{color:#333;}#mermaid-svg-EBg6Sw5oCWRo1xfE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EBg6Sw5oCWRo1xfE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 同一PyTorch模型 为GPU重写cuDNN版本 为CPU优化OpenMP并行 为NPU转换OM模型 三个独立代码库 编译器方式 #mermaid-svg-gWIInYEtoCcUNw3z {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gWIInYEtoCcUNw3z .error-icon{fill:#552222;}#mermaid-svg-gWIInYEtoCcUNw3z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gWIInYEtoCcUNw3z .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gWIInYEtoCcUNw3z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gWIInYEtoCcUNw3z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gWIInYEtoCcUNw3z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gWIInYEtoCcUNw3z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gWIInYEtoCcUNw3z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gWIInYEtoCcUNw3z .marker.cross{stroke:#333333;}#mermaid-svg-gWIInYEtoCcUNw3z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gWIInYEtoCcUNw3z .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gWIInYEtoCcUNw3z .cluster-label text{fill:#333;}#mermaid-svg-gWIInYEtoCcUNw3z .cluster-label span{color:#333;}#mermaid-svg-gWIInYEtoCcUNw3z .label text,#mermaid-svg-gWIInYEtoCcUNw3z span{fill:#333;color:#333;}#mermaid-svg-gWIInYEtoCcUNw3z .node rect,#mermaid-svg-gWIInYEtoCcUNw3z .node circle,#mermaid-svg-gWIInYEtoCcUNw3z .node ellipse,#mermaid-svg-gWIInYEtoCcUNw3z .node polygon,#mermaid-svg-gWIInYEtoCcUNw3z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gWIInYEtoCcUNw3z .node .label{text-align:center;}#mermaid-svg-gWIInYEtoCcUNw3z .node.clickable{cursor:pointer;}#mermaid-svg-gWIInYEtoCcUNw3z .arrowheadPath{fill:#333333;}#mermaid-svg-gWIInYEtoCcUNw3z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gWIInYEtoCcUNw3z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gWIInYEtoCcUNw3z .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-gWIInYEtoCcUNw3z .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-gWIInYEtoCcUNw3z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gWIInYEtoCcUNw3z .cluster text{fill:#333;}#mermaid-svg-gWIInYEtoCcUNw3z .cluster span{color:#333;}#mermaid-svg-gWIInYEtoCcUNw3z div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gWIInYEtoCcUNw3z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 统一计算图描述 TVM编译器 自动生成GPU代码 自动生成CPU代码 自动生成NPU代码 单一代码库维护 这种自动化转型带来的收益 开发周期从3个月缩短至2周硬件利用率平均提升40%维护成本降低80% 至此我们理解了为什么需要机器学习编译器将统一的计算图描述转化为各硬件的高效实现。下一章将深入解析编译器的核心技术。 第二章 技术的演变——编译器架构的进化之路 2.1 第一代模板化代码生成 2.1.1 Halide的核心思想 Halide将算法描述与调度策略分离其核心思想可用以下公式表达 程序 算法 调度 \text{程序} \text{算法} \text{调度} 程序算法调度 // 算法定义3x3均值滤波 Func blur; Var x, y; // 定义二维迭代变量 blur(x, y) (input(x-1, y) input(x, y) input(x1, y)) / 3;// 调度策略配置 blur.tile(x, y, xo, yo, xi, yi, 256, 256) // 分块外层循环256x256.vectorize(xi, 8) // 内层循环向量化每次处理8个元素.parallel(yo); // 外层循环并行执行代码解析 代码片段功能解释优化目标tile(256, 256)将计算划分为256x256的块提高缓存利用率vectorize(xi, 8)对内层循环进行8元素向量化利用SIMD指令parallel(yo)外层循环并行执行多核并行加速 2.1.2 工作流程解析 #mermaid-svg-Cyu30ubiW8xaUlbQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .error-icon{fill:#552222;}#mermaid-svg-Cyu30ubiW8xaUlbQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Cyu30ubiW8xaUlbQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .marker.cross{stroke:#333333;}#mermaid-svg-Cyu30ubiW8xaUlbQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Cyu30ubiW8xaUlbQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .cluster-label text{fill:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .cluster-label span{color:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .label text,#mermaid-svg-Cyu30ubiW8xaUlbQ span{fill:#333;color:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .node rect,#mermaid-svg-Cyu30ubiW8xaUlbQ .node circle,#mermaid-svg-Cyu30ubiW8xaUlbQ .node ellipse,#mermaid-svg-Cyu30ubiW8xaUlbQ .node polygon,#mermaid-svg-Cyu30ubiW8xaUlbQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Cyu30ubiW8xaUlbQ .node .label{text-align:center;}#mermaid-svg-Cyu30ubiW8xaUlbQ .node.clickable{cursor:pointer;}#mermaid-svg-Cyu30ubiW8xaUlbQ .arrowheadPath{fill:#333333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Cyu30ubiW8xaUlbQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Cyu30ubiW8xaUlbQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Cyu30ubiW8xaUlbQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Cyu30ubiW8xaUlbQ .cluster text{fill:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ .cluster span{color:#333;}#mermaid-svg-Cyu30ubiW8xaUlbQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Cyu30ubiW8xaUlbQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 算法描述 手工编写调度策略 代码生成 目标代码 性能测试案例 对3x3卷积进行不同调度策略的测试 调度策略执行时间(ms)加速比基线顺序执行1521.0x分块向量化682.24x分块向量化并行236.6x 2.1.3 局限性分析 问题1策略搜索空间爆炸 假设有5个调度原语分块、向量化、并行化、循环展开等每个有3种参数选择 组合总数 3 5 243 \text{组合总数} 3^5 243 组合总数35243 人工遍历所有组合需要至少243次实验。 问题2硬件适配困难 同一调度在不同硬件的表现 硬件平台最佳分块尺寸向量化宽度Intel i7128x1288ARM A7264x644NVIDIA P100256x25616 问题3跨算子优化缺失 // 两个独立算子 Func conv ...; Func relu ...;// 无法进行融合优化 conv.compute_root(); relu.compute_root();2.2 第二代基于中间表示的优化 2.2.1 TVM的多级IR体系 #mermaid-svg-q9DQtQzcMFKsw6m6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .error-icon{fill:#552222;}#mermaid-svg-q9DQtQzcMFKsw6m6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-q9DQtQzcMFKsw6m6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .marker.cross{stroke:#333333;}#mermaid-svg-q9DQtQzcMFKsw6m6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-q9DQtQzcMFKsw6m6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .cluster-label text{fill:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .cluster-label span{color:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .label text,#mermaid-svg-q9DQtQzcMFKsw6m6 span{fill:#333;color:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .node rect,#mermaid-svg-q9DQtQzcMFKsw6m6 .node circle,#mermaid-svg-q9DQtQzcMFKsw6m6 .node ellipse,#mermaid-svg-q9DQtQzcMFKsw6m6 .node polygon,#mermaid-svg-q9DQtQzcMFKsw6m6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-q9DQtQzcMFKsw6m6 .node .label{text-align:center;}#mermaid-svg-q9DQtQzcMFKsw6m6 .node.clickable{cursor:pointer;}#mermaid-svg-q9DQtQzcMFKsw6m6 .arrowheadPath{fill:#333333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-q9DQtQzcMFKsw6m6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-q9DQtQzcMFKsw6m6 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-q9DQtQzcMFKsw6m6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-q9DQtQzcMFKsw6m6 .cluster text{fill:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 .cluster span{color:#333;}#mermaid-svg-q9DQtQzcMFKsw6m6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-q9DQtQzcMFKsw6m6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 图优化 算子拆分 调度优化 代码生成 Relay IR 优化后的Relay IR TE表达式 TIR 目标代码 关键IR解析 IR层级抽象级别主要功能Relay IR计算图级全局优化、算子融合TE张量运算级算子实现定义TIR低级循环优化硬件特定优化 2.2.2 Relay优化实例 原始计算图 def original():conv relay.nn.conv2d(x, w1)relu relay.nn.relu(conv)bn relay.nn.batch_norm(relu)pool relay.nn.max_pool2d(bn)return pool优化过程 # 应用优化规则序列 with relay.transform.PassContext(opt_level3):mod relay.transform.Sequential([relay.transform.FoldConstant(),relay.transform.FuseOps(fuse_opt_level2),relay.transform.AlterOpLayout()])(mod)优化后计算图 FusedConvReLUBN → MaxPool2D优化效果对比 优化阶段算子数量内存占用(MB)执行时间(ms)原始计算图41.215.3常量折叠31.114.7算子融合20.911.2布局转换20.89.1 2.2.3 TE调度系统 矩阵乘法优化示例 def te_matmul(A, B):m, k A.shapek, n B.shaperc te.reduce_axis((0, k))return te.compute((m, n), lambda i, j: te.sum(A[i, rc] * B[rc, j], axisrc))s te.create_schedule(matmul.op)# 分块策略 xo, xi s[matmul].split(matmul.op.axis[0], factor32) yo, yi s[matmul].split(matmul.op.axis[1], factor32)# 循环重排序 s[matmul].reorder(xo, yo, xi, yi)# 线程绑定 s[matmul].bind(xo, te.thread_axis(blockIdx.x)) s[matmul].bind(yo, te.thread_axis(blockIdx.y)) s[matmul].bind(xi, te.thread_axis(threadIdx.x))# 生成CUDA代码 target tvm.target.Target(cuda) mod tvm.build(s, [A, B, matmul], target)调度策略影响 优化策略执行时间(ms)加速比基线顺序12.51.0x分块重排序5.32.36x线程绑定2.15.9x 2.3 混合式调度系统 2.3.1 MLIR基础设施解析 MLIR采用模块化的方言(Dialect)设计核心架构如下 前端语言 → 高层方言(如TensorFlow Graph) ↓ 渐进式Lowering 中间方言(如Affine Dialect) ↓ 底层方言(如LLVM IR) ↓ 硬件指令关键机制详解 可扩展方言体系 // TensorFlow Lite方言示例 func main(%input: tensor1x224x224x3xf32) - tensor1x1000xf32 {%0 tfl.conv_2d(%input, %filter, %bias) {...} : (tensor1x224x224x3xf32, ...) - tensor1x112x112x64xf32%1 tfl.relu(%0) : (...) - tensor1x112x112x64xf32return %1 : tensor1x1000xf32 }渐进式Lowering过程 高层操作 → 循环嵌套 → 向量指令 → 硬件指令多级IR共存机制 module {func mixed_ir(%arg: tensorf32) - tensorf32 {// 高层操作%0 tfl.custom_op(%arg) : (...) - tensorf32// 底层循环结构affine.for %i 0 to 100 {%1 load %0[%i] : memref100xf32%2 llvm.intr.fmul(%1, %1) : (...) - f32store %2, %0[%i] : memref100xf32}return %0 : tensorf32} }2.3.2 架构对比分析 特性HalideTVMMLIR优化抽象层次循环级计算图循环级全层次硬件扩展性需重写调度策略新增目标后端定义新方言跨优化阶段集成无有限原生支持自动优化能力无基于搜索基于规则搜索 MLIR创新点 统一编译基础设施支持从算法到硬件的全栈表达方言可组合性不同抽象层次的IR可以共存交互形式化语义每个方言都有严格定义的Operation和Type系统 第三章 解决方案的实现——TVM编译器的技术剖析 3.1 计算图优化阶段全局视野的优化艺术 3.1.1 优化规则分类 TVM的计算图优化器包含四大类优化策略 # 优化器配置示例 seq tvm.transform.Sequential([# 基本优化relay.transform.EliminateCommonSubexpr(),relay.transform.FoldConstant(),# 算子级优化relay.transform.FuseOps(fuse_opt_level2),relay.transform.CombineParallelDense(min_num_branches3),# 内存优化relay.transform.AlterOpLayout(),relay.transform.CanonicalizeCast(),# 硬件特定优化relay.transform.ConvertLayout({nn.conv2d: [NHWC, default]}) ])典型优化案例算子融合 原始计算图 Conv2D → ReLU → BatchNorm → MaxPool2D优化过程 # 应用融合规则 mod relay.transform.FuseOps(fuse_opt_level3)(mod)优化后计算图 FusedConv2D_ReLU_BN → MaxPool2D3.1.2 优化效果量化分析 在ResNet-50上的优化效果 优化策略算子数量内存占用(MB)推理时延(ms)无优化2171245152.3常量折叠2031128144.7算子融合98876112.4布局转换9883297.6 3.2 张量表达式系统硬件无关的算子定义 3.2.1 表达式定义范式 卷积算子的完整定义示例 def conv2d_nchw(data, kernel, stride, padding):NCHW布局的卷积计算定义Args:data: 输入张量形状[N,C,H,W]kernel: 卷积核形状[O,C,Kh,Kw]stride: 步长padding: 填充N, C, H, W data.shapeO, _, Kh, Kw kernel.shape# 计算输出尺寸out_h (H 2*padding - Kh) // stride 1out_w (W 2*padding - Kw) // stride 1# 定义规约轴rc te.reduce_axis((0, C), namerc)rh te.reduce_axis((0, Kh), namerh)rw te.reduce_axis((0, Kw), namerw)# 填充计算padded te.compute((N, C, H2*padding, W2*padding),lambda n, c, h, w: te.if_then_else(te.any(h padding, h Hpadding, w padding, w Wpadding),0.0,data[n, c, h-padding, w-padding]),namepadded)# 卷积计算return te.compute((N, O, out_h, out_w),lambda n, o, h, w: te.sum(padded[n, rc, h*stride rh, w*stride rw] * kernel[o, rc, rh, rw],axis[rc, rh, rw]),nameconv2d)3.2.2 自动微分实现 TVM支持自动微分功能 # 定义计算 x te.var(x) y te.var(y) z te.sin(x) * te.log(y)# 创建微分计算 [dz_dx, dz_dy] te.differentiate(z, [x, y])# 生成计算代码 s te.create_schedule([dz_dx.op, dz_dy.op])微分结果 ∂ z ∂ x cos ⁡ ( x ) ⋅ ln ⁡ ( y ) ∂ z ∂ y sin ⁡ ( x ) y \frac{\partial z}{\partial x} \cos(x) \cdot \ln(y) \\ \frac{\partial z}{\partial y} \frac{\sin(x)}{y} ∂x∂z​cos(x)⋅ln(y)∂y∂z​ysin(x)​ 3.3 调度优化原语性能调优的武器库 3.3.1 核心调度原语分类 类别原语示例优化目标循环变换split, reorder, tile数据局部性优化并行化parallel, vectorize多级并行加速内存管理cache_read, double_buffer减少内存访问延迟硬件适配bind, storage_align硬件特性匹配 3.3.2 矩阵乘法的完整优化 def optimize_matmul(s, C):矩阵乘法调度优化# 分块策略x, y s[C].op.axisxo, xi s[C].split(x, factor32)yo, yi s[C].split(y, factor32)s[C].reorder(xo, yo, xi, yi)# 缓存写入优化CC s.cache_write(C, local)# 自动线程绑定s[C].bind(xo, te.thread_axis(blockIdx.x))s[C].bind(yo, te.thread_axis(blockIdx.y))s[C].bind(xi, te.thread_axis(threadIdx.x))s[C].bind(yi, te.thread_axis(threadIdx.y))# 向量化优化s[CC].vectorize(CC.op.axis[-1])# 循环展开ko, ki s[CC].split(s[CC].op.reduce_axis[0], factor4)s[CC].unroll(ki)3.3.3 优化效果对比 在1024x1024矩阵乘法上的测试结果 优化阶段执行时间(ms)GFLOPS加速比基线实现12.5172.31.0x分块重排序5.3406.72.36x线程绑定2.11024.85.95x向量化展开1.41536.08.93x 3.4 自动调优系统机器学习的魔法 3.4.1 AutoTVM架构设计 #mermaid-svg-VniV683vxz1dainw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VniV683vxz1dainw .error-icon{fill:#552222;}#mermaid-svg-VniV683vxz1dainw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VniV683vxz1dainw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VniV683vxz1dainw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VniV683vxz1dainw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VniV683vxz1dainw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VniV683vxz1dainw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VniV683vxz1dainw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VniV683vxz1dainw .marker.cross{stroke:#333333;}#mermaid-svg-VniV683vxz1dainw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VniV683vxz1dainw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VniV683vxz1dainw .cluster-label text{fill:#333;}#mermaid-svg-VniV683vxz1dainw .cluster-label span{color:#333;}#mermaid-svg-VniV683vxz1dainw .label text,#mermaid-svg-VniV683vxz1dainw span{fill:#333;color:#333;}#mermaid-svg-VniV683vxz1dainw .node rect,#mermaid-svg-VniV683vxz1dainw .node circle,#mermaid-svg-VniV683vxz1dainw .node ellipse,#mermaid-svg-VniV683vxz1dainw .node polygon,#mermaid-svg-VniV683vxz1dainw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VniV683vxz1dainw .node .label{text-align:center;}#mermaid-svg-VniV683vxz1dainw .node.clickable{cursor:pointer;}#mermaid-svg-VniV683vxz1dainw .arrowheadPath{fill:#333333;}#mermaid-svg-VniV683vxz1dainw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VniV683vxz1dainw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VniV683vxz1dainw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VniV683vxz1dainw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VniV683vxz1dainw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VniV683vxz1dainw .cluster text{fill:#333;}#mermaid-svg-VniV683vxz1dainw .cluster span{color:#333;}#mermaid-svg-VniV683vxz1dainw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VniV683vxz1dainw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 搜索空间定义 特征提取 成本模型 参数生成 硬件测量 性能评估 组件详解 搜索空间定义描述可调节的调度参数 cfg autotvm.get_config() cfg.define_knob(tile_size, [32, 64, 128]) cfg.define_knob(vectorize, [4, 8, 16])成本模型XGBoost预测性能 y ^ ∑ i 1 n f i ( x ) , f i ∈ F \hat{y} \sum_{i1}^n f_i(x), \quad f_i \in \mathcal{F} y^​i1∑n​fi​(x),fi​∈F 参数搜索采用并行贝叶斯优化 x n e x t arg ⁡ max ⁡ x UCB ( x ) μ ( x ) κ σ ( x ) x_{next} \arg\max_x \text{UCB}(x) \mu(x) \kappa \sigma(x) xnext​argxmax​UCB(x)μ(x)κσ(x) 3.4.2 调优收敛过程 随机采样阶段探索全局空间模型引导阶段快速逼近最优局部优化阶段精细调整参数 3.4.3 实际调优案例 在NVIDIA T4 GPU上调优ResNet-50 阶段时间消耗最佳时延(ms)加速比初始实现015.21.0x随机搜索100次2h9.81.55x贝叶斯优化300次6h6.72.27x专家手动优化40h6.52.34x 3.4.4 技术实现总结 TVM通过分层优化体系实现自动化编译 #mermaid-svg-WqzeJk7tng8RXKx8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 .error-icon{fill:#552222;}#mermaid-svg-WqzeJk7tng8RXKx8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WqzeJk7tng8RXKx8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WqzeJk7tng8RXKx8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WqzeJk7tng8RXKx8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WqzeJk7tng8RXKx8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WqzeJk7tng8RXKx8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WqzeJk7tng8RXKx8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WqzeJk7tng8RXKx8 .marker.cross{stroke:#333333;}#mermaid-svg-WqzeJk7tng8RXKx8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WqzeJk7tng8RXKx8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 .cluster-label text{fill:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 .cluster-label span{color:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 .label text,#mermaid-svg-WqzeJk7tng8RXKx8 span{fill:#333;color:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 .node rect,#mermaid-svg-WqzeJk7tng8RXKx8 .node circle,#mermaid-svg-WqzeJk7tng8RXKx8 .node ellipse,#mermaid-svg-WqzeJk7tng8RXKx8 .node polygon,#mermaid-svg-WqzeJk7tng8RXKx8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WqzeJk7tng8RXKx8 .node .label{text-align:center;}#mermaid-svg-WqzeJk7tng8RXKx8 .node.clickable{cursor:pointer;}#mermaid-svg-WqzeJk7tng8RXKx8 .arrowheadPath{fill:#333333;}#mermaid-svg-WqzeJk7tng8RXKx8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WqzeJk7tng8RXKx8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WqzeJk7tng8RXKx8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WqzeJk7tng8RXKx8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WqzeJk7tng8RXKx8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WqzeJk7tng8RXKx8 .cluster text{fill:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 .cluster span{color:#333;}#mermaid-svg-WqzeJk7tng8RXKx8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WqzeJk7tng8RXKx8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 计算图优化 全局内存优化 算子融合 张量表达式 调度优化 自动调优 高性能代码 关键创新点 跨层优化在不同抽象层级实施针对性优化可组合性调度原语可任意组合产生新策略可移植性同一优化策略适配多硬件后端 实验数据显示TVM在典型工作负载上可获得 相比手工优化库90%以上的性能比原生框架3-10倍的加速比跨硬件平台的一致优化效果 这种技术突破使得深度学习模型可以真正实现一次开发处处高效运行。下一章将通过实际部署案例展示TVM在不同场景中的实践效果。 第四部分实践验证——跨硬件平台的性能对比 4.1 GPU平台测试 在NVIDIA T4上的ResNet-50推理 方法时延(ms)内存使用(MB)功耗(W)PyTorch原生15.2120372TVM自动优化6.887465手工CUDA实现6.583263 4.2 CPU平台测试 Intel Xeon Gold 6248上的BERT推理 优化方法吞吐量(qps)时延(ms)加速比ONNX Runtime7812.81.0xTVM自动调优1427.041.82x手工AVX512优化1556.451.99x 4.3 边缘设备测试 树莓派4B上的MobileNetV2 部署方式时延(ms)内存峰值(MB)能耗(J)TFLite143825.3TVMAutoTVM97643.8手工NEON优化89583.5 第五部分技术演进——编译器架构的未来方向 5.1 动态形状支持 传统静态编译与动态编译对比 静态编译时间 O ( 1 ) 动态编译开销 O ( n ) \text{静态编译时间} O(1) \\ \text{动态编译开销} O(n) 静态编译时间O(1)动态编译开销O(n) TVM的动态shape处理 def dynamic_conv(data, weight):N te.var(n)C te.var(c)H te.var(h)W te.var(w)rc te.reduce_axis((0, C))return te.compute((N, K, H-R1, W-S1),lambda n, k, h, w: te.sum(data[n, rc, hrh, wrw] * weight[k, rc, rh, rw],axis[rc, rh, rw]))5.2 异构计算协同 跨设备计算示例 # GPU执行卷积 with tvm.target.cuda():conv_module tvm.build(conv_sch, [data, weight, conv_out])# NPU执行全连接 with tvm.target.ascend():fc_module tvm.build(fc_sch, [conv_out, fc_weight, output])# 数据流水线 gpu_stream tvm.runtime.DeviceAPI.get_stream(0) npudata conv_module(data, weight) gpu_stream.sync() npuresult fc_module(npudata)5.3 自动化程度提升 未来编译器架构展望 #mermaid-svg-ckPGgEnRkATyDubC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ckPGgEnRkATyDubC .error-icon{fill:#552222;}#mermaid-svg-ckPGgEnRkATyDubC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ckPGgEnRkATyDubC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ckPGgEnRkATyDubC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ckPGgEnRkATyDubC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ckPGgEnRkATyDubC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ckPGgEnRkATyDubC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ckPGgEnRkATyDubC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ckPGgEnRkATyDubC .marker.cross{stroke:#333333;}#mermaid-svg-ckPGgEnRkATyDubC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ckPGgEnRkATyDubC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ckPGgEnRkATyDubC .cluster-label text{fill:#333;}#mermaid-svg-ckPGgEnRkATyDubC .cluster-label span{color:#333;}#mermaid-svg-ckPGgEnRkATyDubC .label text,#mermaid-svg-ckPGgEnRkATyDubC span{fill:#333;color:#333;}#mermaid-svg-ckPGgEnRkATyDubC .node rect,#mermaid-svg-ckPGgEnRkATyDubC .node circle,#mermaid-svg-ckPGgEnRkATyDubC .node ellipse,#mermaid-svg-ckPGgEnRkATyDubC .node polygon,#mermaid-svg-ckPGgEnRkATyDubC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ckPGgEnRkATyDubC .node .label{text-align:center;}#mermaid-svg-ckPGgEnRkATyDubC .node.clickable{cursor:pointer;}#mermaid-svg-ckPGgEnRkATyDubC .arrowheadPath{fill:#333333;}#mermaid-svg-ckPGgEnRkATyDubC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ckPGgEnRkATyDubC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ckPGgEnRkATyDubC .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ckPGgEnRkATyDubC .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ckPGgEnRkATyDubC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ckPGgEnRkATyDubC .cluster text{fill:#333;}#mermaid-svg-ckPGgEnRkATyDubC .cluster span{color:#333;}#mermaid-svg-ckPGgEnRkATyDubC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ckPGgEnRkATyDubC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不达标 达标 计算图 自动算子切分 自动调度优化 自动代码生成 性能验证 部署
http://www.dnsts.com.cn/news/56590.html

相关文章:

  • 网站建设如何为企业电商化转型赋能吉林省建设厅证件查询网站
  • 试述网站建设的步骤海南百度推广中心
  • 商业网站是什么手表官网
  • 做个简单的导航网站专业做棋牌网站的
  • 网站建设公司兴田德润可信赖关注国内国际时事
  • 抄袭网站怎么办无版权图片网站
  • 关于协会网站建设的建议网站开发流行工具
  • 昆明网站建设的公司wordpress 4.4.1 漏洞
  • 路由器统一登录网站广州建设外贸网站
  • 免费无版权图片网站为什么wordpress后台写文章不一样
  • html5移动端手机网站开发流程图商城网站建设报价方案
  • 浙江省住房与城乡建设厅网站怎么做网站的ico
  • 清河网站建设西安网站建设网络推广
  • 网站建设免费视频教学网页设计尺寸单位
  • 营销型网站收费项目网源码
  • 南宁网站快深圳做网站的价格
  • 站长seo5118关键词查询工具
  • 财务管理做的好的门户网站怎么建立微信群
  • 电商网站开发书籍wordpress模版制作工具
  • 北京做百度网站建设专业做邯郸网站优化
  • 温州微网站制作公司哪家好怎样做班级网站
  • 免费主页空间申请网站电商网站建设费用价格
  • 网站虚拟机从头做有影响吗公司logo设计在线制作
  • 英茗网站建设北京效果好的网站推广
  • 做网站感想装饰公司 网站模板
  • 遵义网站建设公司招聘会议平台网站建设
  • 国内最好的网站建设公司wordpress 扫码登录
  • 网站的安全性建设网站建设系统设计报告
  • 模板建站服务器正规的计算机培训机构
  • 网站怎么做用户体验做网站图片要求