先把结论放在最前面,给最近一直在问“Atlas 300V 24G到底是不是运算加速卡”的朋友们一句话解释:它是运算加速卡,但准确说是AI推理加速卡,不是拿来做通用训练的那类GPU。这篇文章我不想只给一句话,我会把这张卡在整个AI推理链路上的定位、和GPU的实质性区别、以及怎么真正把YOLO系列模型部署上去跑出可用结果,全部展开讲透。
我自己在了解这张卡时,印象最深的是它的配置:24GB的显存(准确说是大容量内存),单槽或双槽PCIe卡形态,整卡功耗控制在一个很低的水平。很多人看到“24G”第一反应是“这总不能是张游戏卡吧”,对,它不是。它面向的是数据中心边缘推理、视频分析、AI中低负载推理场景,最常见的活儿就是跑YOLO、跑分类网络、跑OCR模型这类视觉任务。下面我就以“Atlas 300V 24G 部署 YOLOv5”为主线,把从硬件选型到模型转换再到推理代码的整条链路都过一遍。
1. Atlas 300V 24G的硬件定位:一张“能装大模型”的推理卡
1.1 一张PCIe卡,做的到底是什么活
Atlas 300V 24G本质上是一张标准PCIe加速卡,外观和使用方式都跟你插一块独立显卡差不多。服务器或者工作站里只要有空闲的PCIe x16插槽,插上、装好驱动,npu-smi info能看到设备,就能开始干活。
它主打的是推理(Inference),不是训练(Training)。训练要求卡能灵活支持各种动态shape、各种复杂算子、大batch的梯度回传,一般需要比较完整的可编程能力和很大的显存带宽。而推理任务相对固定:模型结构定了,输入尺寸定了,要做的事情就是“尽量快、尽量省电地算出结果”。Atlas 300V 24G就是围绕这个目标设计的,它把算力、功耗、内存容量做了平衡。
我之前接触过一个实际场景:一个视频分析项目,需要对8路1080P视频流实时跑行人检测。用普通CPU跑YOLOv5s只能做到2~3 FPS,完全不可用;换上一张Atlas 300V 24G之后,同一份模型转换出来的OM文件,单路能做到几十FPS,8路并发也能扛住。这就是这类推理卡存在的意义。
1.2 硬件规格速览:别只看显存容量
网上关于Atlas 300V 24G的公开规格,最常被提到的就是24G内存。但选型的时候不能只看这一项,下面几个指标更关键:
| 指标 | 参考数值 | 为什么重要 |
|---|---|---|
| 内存容量 | 24GB | 决定能不能装下大模型、多batch推理 |
| 内存类型/带宽 | 类似LPDDR4X,实测带宽约200GB/s级 | 影响数据搬运速度,带宽不够算力再强也喂不饱 |
| INT8算力 | 百TOPS级别(视具体型号/频率) | 推理场景普遍用INT8做加速 |
| FP16算力 | 几十TFLOPS级别 | 不量化时用FP16推理,精度高一些 |
| 功耗 | 几十瓦到一百瓦上下,具体看负载 | 也是它相比GPU很明显的优势 |
| 接口形态 | PCIe标准卡,大部分x16插槽可用 | 部署方便 |
单看24G会很震惊,会以为它能跟RTX 4090 24G去硬碰硬。但实际上去看带宽和通用计算能力,两者定位完全不同。RTX 4090是为了训练、渲染、游戏这种高吞吐场景设计的,代价是300多瓦功耗;Atlas 300V 24G用很小的功耗就提供了可观的推理算力,但在灵活性上远不如NVIDIA的CUDA生态,这一点后面会详细说。
1.3 一张卡能干什么,不能干什么
先列一张“能干什么”的清单,方便你对号入座:
- 能跑YOLOv5/YOLOv7/YOLOv8等常见检测模型(经过模型转换)
- 能跑分类模型(ResNet、MobileNet等)
- 能跑OCR、语义分割等常见CV模型
- 能跑一些轻量级NLP模型
- 能通过多batch、多stream的方式提升吞吐量
- 能配合CANN的AIPP做图像预处理的硬件加速
再来说“不能干什么”或者“不建议干什么”:
- 不适合做大模型训练,动态图和自动微分支持弱很多
- 不适合跑对算子灵活性要求极高的自定义网络
- 不适合直接把GPU的TensorRT/ONNX Runtime方案原生搬过来跑,需要转换
- 不适合在没有CANN经验的情况下,指望当天上手就调出最优性能
一句话概括:这是一张定位非常明确的专业推理卡,适合做量化部署和固定场景的AI应用,不适合做研究探索型的训练项目。
2. 为什么选择Atlas 300V 24G来跑YOLO:算力之外的两本账
2.1 成本账:功耗和单卡价格的双重优势
在AI推理场景里,电费和机柜空间往往比硬件本身更敏感。一个比较典型的对比:拿一张300W以上的GPU做推理,满载功耗很高,而且需要配套更大的电源、更强的散热、更粗的供电线。Atlas 300V 24G整卡功耗低很多,而且因为卡上本身带了24G内存,很多中低负载的推理任务不需要再去买大显存GPU,可以省下不少预算。
我算过一笔账:一个中等规模的视频分析项目,20路视频流,如果全部用GPU方案,可能需要两块中高端显卡,整机功耗接近700W+;换成Atlas 300V 24G,一张卡基本够用,整机功耗会低很多。一年下来电费差距可以覆盖不少其他成本。对成本敏感的客户,这个差异很有吸引力。
2.2 软件栈成熟度:CANN到底靠不靠谱
很多人犹豫的原因就是软件生态。NVIDIA的CUDA生态十几年积累,确实很成熟;昇腾这边的CANN(Compute Architecture for Neural Networks)工具链经过几个大版本的迭代,现在已经不是早期那种“装环境三天,转模型半天”的状态了。
CANN工具链的核心组件包括:
- 驱动:负责NPU设备的底层管理,装好后通过
npu-smi info能看到设备状态 - CANN Toolkit:包括运行时、Atlas 200/300/500推理卡所需的软件包,ATC模型转换工具也在里面
- AscendCL(ACL):应用开发接口层,类似于CUDA Runtime,负责模型加载、推理执行、内存管理
- MindSpore Lite:昇腾上的推理框架,支持直接加载OM模型
- ATC工具:把ONNX、TensorFlow、MindSpore等模型转换为昇腾的OM离线模型
对部署YOLO来说,核心链路是:PyTorch训练得到权重 → 导出ONNX → 用ATC转换为.om文件 → 用AscendCL或MindSpore Lite加载推理。
这套链路现在能跑通,而且坑虽然存在,但基本都是可以排查的。后面我会把每一步的实操细节和坑都写出来。
2.3 什么样的业务场景适合吃这口饭
不是所有项目都适合上Atlas,适合它的画像通常有这几个特征:
- 模型结构相对固定,不需要频繁改网络结构
- 输入图像尺寸可以固定,比如YOLO常见的640×640
- 业务上能接受做INT8量化(如果追求极致性能)
- 有比较多的CPU核用来跑后处理(NMS等)
- 推理服务部署在机房,不是个人电脑
如果你的项目满足其中三条以上,用Atlas 300V 24G就非常合适。特别是“固定尺寸+固定模型+高并发视频流”这个组合,完全就是它的主场。
3. 部署YOLO的完整实操流程:从ONNX到OM再到推理
3.1 环境准备:驱动和CANN的安装要点
这一步最容易被轻视,但实际出问题最多的也是在环境阶段。首先你要有一台x86架构的服务器,操作系统建议用Ubuntu 20.04或22.04,内核不要太老也不要太新,太新可能会出现驱动编译兼容性问题。
主要安装顺序是:
- 装NPU驱动(通常是.run安装包,比如
Ascend-hdk-*.run) - 装CANN Toolkit软件包(
Ascend-cann-toolkit_*.run) - 装CANN NNAE或推理增效包(按需)
- 配置环境变量
- 用
npu-smi info确认设备状态
装完之后,核心环境变量大概是这样的:
export ASCEND_HOME=/usr/local/Ascend/ascend-toolkit/latest export PATH=$ASCEND_HOME/bin:$PATH export LD_LIBRARY_PATH=$ASCEND_HOME/lib64:$LD_LIBRARY_PATH export PYTHONPATH=$ASCEND_HOME/python/site-packages:$PYTHONPATH注意:驱动和CANN版本必须匹配。我因为图省事装过一套不匹配的版本,导致设备状态显示正常,但一加载模型就报错。建议严格按照官方版本兼容表来。
安装完成后,运行npu-smi info能看到类似下面的输出,说明设备正常:
+------------------------------------------------------------------------------------+ | npu-smi 22.0.0 Version: 22.0.0 | +-------------------+-----------------+----------------------------------------------+ | NPU Name | Health | Power | Hugepages-Usage | | Device | Version | Bus-Id | Memory-Usage | +===================+=================+==============================================+ | 0 Atlas 300V 24G| OK | 23W | 1024MB / 24576MB |如果执行命令时提示“No NPU device found”,优先检查驱动是否加载成功、是否用root权限安装、服务器BIOS里是否关闭了IOMMU或做了正确的PCIe ACS设置。
3.2 从PyTorch导出ONNX:YOLOv5只是一个例子
YOLOv5的官方代码仓库里自带export.py,可以直接导出ONNX。但很多人在生产环境用的是自定义训练的版本,或者对模型输出层做过修改,这时候就要自己写导出脚本。
一段最小可用的导出代码如下:
import torch # 假设你已经加载好了自己训练的模型 # 这里用YOLOv5作为示例 model = torch.load('yolov5s.pt', map_location='cpu')['model'].float() model.eval() # 关键:开启export模式,让模型输出原始预测结果(不做NMS) model.model[-1].export = True # 固定输入尺寸,静态shape对ATC转换最友好 dummy_input = torch.zeros(1, 3, 640, 640) torch.onnx.export( model, dummy_input, 'yolov5s.onnx', opset_version=11, input_names=['images'], output_names=['output'], dynamic_axes=None # 静态shape,动态shape后面再说 )这里有几个细节要重点说明:
- 务必关闭模型的NMS后处理。YOLOv5默认推理时会做NMS,但导出ONNX时只需要原始输出,NMS放在CPU侧做,或者用别的方式做。如果导出时把NMS带进去了,在ATC转换时往往会因为NMS算子不支持而报错。
- 输入输出命名要固定好。后面ATC转换指定
input_names和output_names时要一致,虽然很多例子不强制,但养成好习惯能避免低级错误。 - 动态shape要谨慎。如果业务里图片分辨率会变化,确实可以考虑
dynamic_axes,但ATC转换动态shape模型时性能和兼容性都会打折。我建议固定分辨率,如果业务需要多分辨率就多出几份OM模型。
3.3 使用ATC把ONNX转换为OM模型
转换工具叫ATC(Ascend Tensor Compiler)。以Atlas 300V 24G对应的昇腾芯片为例,一个标准的转换命令长这样:
atc \ --model=yolov5s.onnx \ --framework=5 \ --output=yolov5s_bs1 \ --soc_version=Ascend310P3 \ --input_shape="images:1,3,640,640" \ --input_format=NCHW \ --precision_mode=allow_fp32_to_fp16 \ --insert_op_conf=aipp.cfg \ --output_type=FP16参数含义拆开看:
--framework=5:5代表ONNX,这是固定值--soc_version=Ascend310P3:Atlas 300V系列常见的主控芯片版本写这个,具体以官方文档或npu-smi info的芯片信息为准--input_shape:严格对应导出的输入尺寸。如果导出的是动态shape,这里要填类似"images:1,3,640,640"这样的具体值也能做,但需要先在导出时保证batch维度固定--insert_op_conf=aipp.cfg:把图像预处理配置在NPU侧,后面说--output_type=FP16:输出用FP16可以减小带宽压力,后处理时再转float
AIPP(AI Preprocessing)是一个很值得讲的部分。它的作用是在NPU内部完成图像的尺寸调整、颜色通道转换、归一化等操作,不用在CPU侧单独做。一个典型的AIPP配置如下:
aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 csc_switch: true rbuv_swap_switch: false crop: false mean: 0.0 0.0 0.0 min: 0.0 0.0 0.0 var: 0.003921569 0.003921569 0.003921569 }这里把var设置成1/255,意思是把0~255的像素归一化到0~1。如果你的模型在训练时用的归一化方式不同,比如ImageNet的mean和std,也要在这里做对应修改。这里最容易出问题的点就是mean/var的顺序和通道顺序,RGB还是BGR一定要和模型训练时一致,否则推理结果会非常诡异。
关于静态batch和动态batch的选择,我建议转换时先出一个batch=1的版本跑通流程,再转换一个batch=4或batch=8的版本做性能对比。实践中batch=8的OM模型在并发吞吐上往往比多个单batch实例更高效,但内存占用也会上升。
3.4 推理代码实现:用AscendCL加载OM模型
模型转换完成之后,就到了推理代码这一步。昇腾上最底层的推理接口是AscendCL,可以理解成“昇腾的CUDA Runtime”。
下面我给你一个最小可用的C++调用骨架,思路是:初始化设备 → 加载模型 → 准备输入输出内存 → 执行推理 → 后处理。
#include "acl/acl.h" #include <opencv2/opencv.hpp> #include <vector> #include <cstring> int main() { // 1. 初始化 aclInit(nullptr); int32_t deviceId = 0; aclrtSetDevice(deviceId); aclrtContext context; aclrtCreateContext(&context, deviceId); // 2. 加载OM模型 uint32_t modelId; aclmdlLoadFromFile("yolov5s_bs1.om", &modelId); // 3. 获取模型输入输出描述 aclmdlDesc *modelDesc = aclmdlCreateDesc(); aclmdlGetDesc(modelDesc, modelId); size_t inputSize = aclmdlGetInputSizeByIndex(modelDesc, 0); size_t outputSize = aclmdlGetOutputSizeByIndex(modelDesc, 0); // 4. 准备输入输出内存 void *inputBuffer = nullptr; void *outputBuffer = nullptr; aclrtMalloc(&inputBuffer, inputSize, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc(&outputBuffer, outputSize, ACL_MEM_MALLOC_HUGE_FIRST); // 5. 读图并做预处理:这里以640x640 RGB为例 cv::Mat img = cv::imread("test.jpg"); cv::Mat resized; cv::resize(img, resized, cv::Size(640, 640)); cv::cvtColor(resized, resized, cv::COLOR_BGR2RGB); // 归一化等操作可以交给AIPP,这里只需要把raw数据拷入 memcpy(inputBuffer, resized.data, inputSize); // 6. 创建输入输出数据集并执行推理 aclmdlDataset *inputDataSet = aclmdlCreateDataset(); aclDataBuffer *inputDataBuffer = aclCreateDataBuffer(inputBuffer, inputSize); aclmdlAddDatasetBuffer(inputDataSet, inputDataBuffer); aclmdlDataset *outputDataSet = aclmdlCreateDataset(); aclDataBuffer *outputDataBuffer = aclCreateDataBuffer(outputBuffer, outputSize); aclmdlAddDatasetBuffer(outputDataSet, outputDataBuffer); aclmdlExecute(modelId, inputDataSet, outputDataSet); // 7. 拿到输出之后在CPU侧做后处理(解析框、NMS等) // 8. 资源清理 aclrtFree(inputBuffer); aclrtFree(outputBuffer); aclmdlDestroyDesc(modelDesc); aclmdlUnload(modelId); aclrtDestroyContext(context); aclrtResetDevice(deviceId); aclFinalize(); return 0; }如果不想用C++,也可以直接用昇腾社区提供的Python接口,但底层逻辑完全一样。我建议第一次跑通用C++或者官方样例,能更清楚内存和生命周期管理是怎么回事。Python封装的好处是开发快,坏处是一旦报错你不太容易定位是底层内存问题还是数据格式问题。
3.5 性能验证:FPS怎么测才靠谱
部署完成后,很多人直接跑一次推理时间就宣称“性能是多少FPS”,这其实不严谨。推理性能测试要考虑三个因素:
- 冷启动 vs 热启动:第一次推理因为模型加载、内存初始化等开销,耗时明显偏高;生产环境下一般来说服务是常驻的,所以要测热启动后连续推理的稳定耗时。
- 单stream vs 多stream:NPU支持创建多个推理流。我用同一个OM模型测试过,把请求拆到两个stream并发,整体吞吐量往往比单stream更高,尤其当模型较小、算力有余时,多stream能把硬件利用率顶上去。
- 是否包含后处理:YOLO的后处理(解码、NMS)在CPU侧完成,这一部分经常被忽略。严格意义上端到端FPS应当包含前处理+推理+后处理整个过程。
一个简单的测量方法:
# 连续推理1000次,统计总耗时,除以1000得到平均单次推理耗时 time=0 for i in {1..1000} do start=$(date +%s%N) ./yolo_infer test.jpg end=$(date +%s%N) time=$((time + end - start)) done echo "avg ms: $((time / 1000000 / 1000))"更专业的做法是用设备侧的时间统计接口,比如ACL提供的事件接口aclrtCreateEvent,可以精确统计NPU上的执行时间,排除CPU预处理和后处理的干扰。
我在实际测试中,Atlas 300V 24G上跑YOLOv5s,输入640×640,FP16精度,静态batch=1,单stream稳定能跑到几十毫秒内。要注意的是,不同版本的YOLO、不同的CANN版本、不同的量化方式,最终结果差距可能很大,所以不要盲目相信别人给的数字,关键是掌握测试方法。
4. 部署中的常见问题与排查实录
4.1 ATC转换时报算子不支持或Unknown Op
这是新手最容易碰到的问题。YOLO系列模型结构不算复杂,但某些PyTorch算子导出的ONNX节点,在昇腾上不一定有对应的高性能实现。
排查步骤:
- 看报错日志里具体是哪个算子不支持
- 去昇腾社区查这个算子在当前CANN版本是否支持
- 升级CANN到更新版本,算子支持面通常更广
- 考虑修改模型结构,尝试用等价算子的组合代替
- 如果必须保留动态shape,检查是不是动态shape导致某些算子无法转换
遇到不支持的算子时,不要急着改模型,先看日志。很多时候只是一个简单的slice/gather节点,ATC的若干版本里支持情况不同,升级一下就解决了。
4.2 推理结果全是0或者检测框乱飘
这个问题十有八九出在预处理和AIPP上。
我排查过这样一个案例:模型是用RGB训练的,但推理时OpenCV读图是BGR,而AIPP配置里设了rbuv_swap_switch: false,结果输入通道反了,检测框到处乱飘但完全对不上目标。把rbuv_swap_switch打开后问题立刻消失。
另一个常见坑是归一化。有些YOLO版本训练时用0~1范围,有些用0~255范围,还有些用了特定的mean/std。AIPP里的mean和var参数必须要和训练时完全一致。这里最容易出错的是除以255还是除以256的问题。很多模型训练代码里写的是/255.0,但在硬件实现上可能做了定点化处理,导致结果有细微偏差。虽然对检测框影响不大,但在精度要求高的项目中就会体现出来。
4.3 显存分配失败或设备掉线
Atlas 300V 24G虽然内存不小,但如果batch设太大、或者模型转换时把输入shape定得过大,仍然会出现内存不足的问题。
处理办法:
- 用
npu-smi info查看当前显存使用率 - 检查是否有遗留进程没有释放NPU资源,
kill掉后重新申请 - 检查是不是多模型同时加载导致内存耗尽,评估是否需要串行
- 如果单batch测试正常,但多batch报错,优先调低batch大小
设备掉线问题(比如aclrtSetDevice卡死)一般和驱动稳定性有关。遇到这种情况,先重启设备再重新训练或推理前,确认驱动版本和CANN版本匹配。另外,如果服务器上同时有多张卡,还要确认是否把deviceId传对了。
4.4 输入图片的letterbox处理不一致
YOLO系列的推理,常规做法是把图片做letterbox处理后缩放到640×640,也就是保持宽高比、四周补灰边。这个步骤很多人直接忽略了,直接把原图resize到正方形,结果模型的效果大打折扣。
原因很简单:模型训练时使用letterbox后的图片,输入分布和推理时不匹配,自然会掉精度。所以要么在CPU侧先做letterbox,要么把letterbox的参数配置到AIPP里。但注意AIPP做的是resize和crop,它并不自动做letterbox的逻辑,如果你要严格保持训练时的输入分布,我建议在CPU侧先用OpenCV处理好再喂给NPU。
如果推理性能成为瓶颈,可以考虑把resize和padding操作放到AIPP里,但要把letterbox的逻辑预先计算好,不能指望AIPP自动理解“保持宽高比”这件事。
4.5 后处理中的坐标转换
YOLO模型的输出是特征图上的相对坐标,需要换算回原图坐标。如果在推理前做了letterbox,后处理时要把坐标还原到原图,这一步特别容易出错。
坐标还原的公式不复杂,但必须严格记录letterbox的缩放比例和padding偏移量。一个经典错误是:只做了scale,忘了把padding的像素减掉,导致检测框整体偏移。
我自己习惯的做法是写一个函数,专门记录letterbox的参数,在后处理时统一还原:
def letterbox_restore(box, scale, pad_x, pad_y): # box 是 [x1, y1, x2, y2] 且基于640x640输入 x1 = (box[0] - pad_x) / scale y1 = (box[1] - pad_y) / scale x2 = (box[2] - pad_x) / scale y2 = (box[3] - pad_y) / scale return [x1, y1, x2, y2]5. 一些我个人总结的实操经验
5.1 先在转模型之前把模型结构“拆干净”
很多YOLO项目代码为了训练方便,会加入各种训练辅助分支、EMA、多尺度训练逻辑。导出ONNX之前,最好去掉这些无关节点,只保留前向推理必需的算子。我见过有人直接把带训练逻辑的模型导出,结果ATC转换时冒出一堆支持或不支持的算子,排查起来非常痛苦。
建议导出前先做一个“最小化验证”:在PyTorch里直接加载权重,跑一次纯前向,确认输出shape和数值正常,再导出ONNX。如果这一步都没跑通,后面用ATC转换只能是盲人摸象。
5.2 IS_INT8量化值得认真对待
Atlas 300V 24G这类推理卡,最大优势之一就是INT8算力远高于FP16算力。如果你的业务对精度容忍度还可以,做一次INT8量化能显著提升推理吞吐。
但量化不是简单的“把权重从FP16换成INT8”。官方工具链通常提供量化校准流程,需要准备一批有代表性的校准数据。我踩过的坑是:用了训练集的图片做校准,结果模型在真实场景掉点严重。正确做法是用“推理时遇到的问题分布最接近的图片”做校准,比如推理时主要是夜晚监控画面,校准数据就要多放夜晚画面,少放白天风景图。
5.3 多实例部署时最容易被忽略的CPU瓶颈
Atlas这张卡的推理速度上去了,但YOLO的NMS和坐标解析仍然在CPU上跑。我做过一个压力测试:NPU推理只需要十几毫秒,但CPU后处理跑了三十几毫秒,导致整体吞吐被CPU拖垮。后来把NMS换成并行实现,并把多个推理请求的后处理分散到不同CPU核,整体端到端延迟才降下来。
所以配置服务器时,不要只顾着买推理卡,CPU核心数和内存频率同样重要。我的建议是,如果主要跑YOLO系列模型,CPU至少要有8个物理核,而且要给后处理任务预留足够的核数,否则再快的NPU也发挥不出来。
5.4 如果连不上社区或文档找不到答案怎么办
以我个人经验,遇到昇腾问题时核心思路有三步:先看CANN自带的sample代码,再看官方文档的算子支持列表,最后才去社区提问。很多问题其实在sample里都能找到答案,比如AIPP怎么配、ACL接口怎么调用、模型转换参数怎么填。
另外,遇到版本问题时,把CANN版本、驱动版本、芯片型号、完整报错日志这四样信息整理清楚再问别人,效率会高很多。我自己也常常帮同事排障,最怕的就是对方只丢一句“报错了”,没有版本信息也没有完整日志,这谁也帮不上忙。
5.5 这张卡到底值不值得买?
如果你是做AI推理部署的,业务模型以CV为主,输入尺寸固定,希望低功耗、低成本地跑一个长期在线服务,Atlas 300V 24G是一个很务实的选择。特别是它24G的容量,让很多中等规模的模型有了一个相对宽裕的落脚点。但如果你主要是在GPU上做训练和快速实验,或者需要频繁换网络结构,那它未必适合你。
我个人在实际项目中的体会是:推理卡和训练卡本来就是两类工具,不要指望一张卡解决所有问题。把训练放在GPU上、把稳定的推理服务放在Atlas上,各取所长,才是性价比最高的方案。如果让我给新手一个建议,那就是先别急着买卡,先把手头的YOLO模型用CPU推理跑通,跑出可评估的基准结果,再转到Atlas上对比推理性能和精度差异,这样你才能真正看懂这张卡带来的提升有多大。