尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Atlas 300V 24G推理卡部署YOLO实战:从ONNX到OM完整指南
1. 先搞清楚 Atlas 300V 24G 到底是一张什么卡1.1 热搜问题背后的认知误区推理卡和训练卡是两码事最近atlas 300v 24g 是运算加速卡吗这个搜索热度一直不低。我可以直接给结论它是运算加速卡但它的核心定位是推理加速卡不是拿来训练的卡。别小看这句话我和很多刚开始接触昇腾生态的人一样最初都把加速卡三个字等同于什么都能加速。实际上Ascend 体系里的产品线分得很清楚Atlas 200/300 系列面向推理Atlas 800 训练服务器、Atlas 900 集群面向训练两者从芯片设计目标开始就完全是两个方向。Atlas 300V 24G 用的是昇腾 310P 芯片官方资料里的常见标称是INT8 算力约 140 TOPSFP16 算力约 70 TFLOPS搭载 24GB LPDDR4X 内存内存带宽在 200GB/s 上下单卡功耗控制在几十瓦级。这个规格放在推理卡里属于能干重活的级别尤其 24GB 的内存在同类推理卡里非常能打——很多视频分析、多路流并行推理的场景显存不够才是真瓶颈算力反而不是。那为什么不能用来训练因为 310P 芯片在算子设计上做了大幅裁剪它把资源集中在卷积、矩阵乘这些推理高频算子上面一些训练需要的前向反向联动、自动求导、动态 shape 支持并不是它的重点。训练卡需要的是全算子覆盖推理卡追求的是低时延、高吞吐、低功耗。拿推理卡去训练 YOLO等于让一个专业质检员去干流水线装配工的活能干但效率极低而且很多 PyTorch 训练算子根本没做适配。1.2 24GB 大内存对推理的意义比你想象中大很多人不理解推理卡要那么大内存干嘛。我在实际部署中的体会是推理场景的内存消耗远比想象中高一张 640x640 输入的 YOLOv5s单个 batch 可能只要几十 MB 模型空间但一旦上多路视频流、多 batch 并发、或者跑 YOLOv8-seg 这类带分割头的模型内存占用会迅速涨上去。另外 24GB 内存配合大 batch 推理能显著提升芯片的利用率。以 300V 跑 YOLOv5s 为例单张图大约 2-4ms 的纯 NPU 推理时间如果单 batch 跑芯片利用率可能只有三成把 batch 调到 8 或者 16吞吐能翻两到三倍。这里的关键是推理卡的算力要靠并发喂饱而并发的基础就是足够的内存。所以 300V 给 24GB 内存定位非常明确——面向视频分析、边缘服务器、一体机这类需要高吞吐推理的商用场景。1.3 和 GPU 最大的差异软件栈完全是另一套如果你之前只玩过 N 卡第一次接触 Atlas 300V 时最不适应的就是软件栈。CUDA 生态是一套成熟的东西conda 装个 PyTorchcudnn 自动匹配模型丢进去就跑。昇腾这边是 CANN昇腾计算架构 不同推理框架的组合模型从 PyTorch 到能跑在 NPU 上中间要经过模型转换、算子适配、内存管理这几个环节。打个比方在 GPU 上部署模型相当于你把行李箱直接放进出租车后备箱司机认路在 Atlas 上部署模型相当于你要先把行李重新打包一遍再叫一辆指定路线的专车。多了一道工序但如果你能接受这个工序后面的路其实并不难走。2. 在 Atlas 300V 上跑 YOLO 的真实路径为什么不能 pip install 就完事2.1 我最初踩的三个预期错误先说我最开始犯的错给大家当反面教材。错误预期一把 300V 当成 GPU 用写好 PyTorch 脚本直接 torch.load 权重。实际跑起来才会发现torch_npu 插件确实存在但 YOLOv5 的原始检测代码里很多算子在 Ascend NPU 上并没有注册实现尤其是训练阶段的自定义 autoshape、NMS 这些部分。就算你能加载权重前向传播也会卡在某个算子上报错。错误预期二以为模型转换就是把 .pt 文件用某个工具一键变成 .om。实际上 ATC 工具只认 ONNX、TensorFlow、MindSpore 等中间格式而且对输入输出节点、shape、算子类型都有严格要求。错误预期三觉得 OM 模型是万能钥匙在一台机器上转换好复制到任何 Atlas 设备上都能跑。实际上 OM 和 SoC 版本强绑定310P 的 OM 放到 310 上直接报错必须用对应 --soc_version 重新转换。2.2 三条主流技术路线对比根据我查资料和动手测试的经验现在在 Atlas 300V 上跑 YOLO主流路线有三条路线链路适用场景难度APyTorch - ONNX - ATC - OM - PyACL 推理生产部署、固定输入尺寸、追求极致性能中BMindSpore 模型直接导出 OM如果你已经用 MindSpore 训练中Ctorch_npu 直接在 PyTorch 里跑快速验证、动态 shape 需求多中高如果你是第一次上手我推荐路线 A。原因很简单YOLO 生态里 PyTorch 权重最多ONNX 导出工具最成熟ATC 转换链路的文档也最全。路线 C 虽然看起来最省事但实际问题很多torch_npu 对动态 shape 的支持参差不齐跑通一个 YOLOv5 推理不但要改不少代码还可能遇到算子 fallback 到 CPU 导致性能崩掉的情况。2.3 为什么 YOLO 反而是最适合走上这条路的模型YOLO 这个模型结构非常适合 Atlas 推理卡因为它的核心计算高度集中在卷积和矩阵乘上这类算子在 ASCEND 芯片上做了深度优化。而 NMS 等后处理部分是 Python 代码在 CPU 上跑的不会成为 NPU 的负担。所以做 YOLO 部署时我强烈建议导出的 ONNX 只包含 Backbone Neck Head 这部分前向推理网络把置信度过滤和 NMS 放到 CPU 侧的 Python 后处理里。很多第一次部署的人会把 torchvision 自带的 NMS 一起写进导出模型里结果转 OM 时报算子不支持白白消耗时间。3. 环境搭建驱动、固件与 CANN 工具链的版本匹配3.1 安装顺序错一步后面全乱准备好 Atlas 300V 24G 之后第一步不是急着装 CANN而是先装固件和驱动。规范的顺序是先固件再驱动最后装 CANN toolkit。如果顺序反了很可能 NPU 设备节点异常或者 npu-smi 能识别到卡但 acl init 失败。以我这次的 Ubuntu 环境为例大致流程是从昇腾社区下载和硬件匹配的固件包.run 文件官方命名类似Ascend-hdk-310P-firmware_xxx.run执行安装。安装驱动包Ascend-hdk-310P-npu-driver_xxx.run。安装 CANN 工具包Ascend-cann-toolkit_xxx.run推荐以非 root 用户安装到默认路径/home/xxx/Ascend。配置环境变量source 一下/home/xxx/Ascend/ascend-toolkit/set_env.sh。执行npu-smi info确认能看到下面这种设备信息------------------------------------------------------------------------------------------- | NPU Name Health Power HBMusage Temp Hugepages-Usage | | 0 Ascend 310P3 OK 28.0W 0.0MB 41 0 / 0 | -------------------------------------------------------------------------------------------如果你执行 npu-smi 报错先别急着查 CANN大概率是驱动没装好。3.2 版本匹配的坑不是越新越好这可能是整个环境搭建环节最折磨人的部分。CANN、驱动、固件三者之间有严格的配套关系CANN 版本太新驱动太旧或者反过来都会导致各种奇怪问题。我遇到过的情况是CANN 7.0 配一个较旧版本的固件acl init 正常但 ATC 转出来的 OM 一加载就报E15001错误查了半天才知道是固件里的 runtime 和 CANN 版本不匹配。建议做法是先确定 CANN 版本然后去查官方配套表把对应的固件驱动版本一次性下载好。不要图新用生产环境验证过的组合更稳。提示装完一切正常之后记得把set_env.sh的 source 写进.bashrc。否则每次新开终端都要手动 source而且 ATC 和 PyACL 都会报找不到 so 库的错误。3.3 开发环境与运行环境的区别CANN 安装的时候区分开发环境和运行环境。开发环境包含 ATC 转换工具、编译工具链、头文件等运行环境只包含推理所需 runtime。我个人的建议是如果你的机器承担模型转换 推理双重任务直接装开发环境省事如果是纯生产环境只装运行环境减小攻击面和体积。4. 模型转换用 ATC 把 YOLO 的 ONNX 变成 OM4.1 先从 YOLOv5 导出干净的 ONNX我以 YOLOv5s 为例因为它最典型。执行python export.py --weights yolov5s.pt --include onnx --opset 11 --imgsz 640 640这个命令会导出 640x640 输入的 ONNX 文件。导出之后有两个细节必须检查用 Netron 打开 ONNX确认输入节点名。YOLOv5 的输入节点名通常是images输出节点名通常是output0。ATC 转换时这两个名字必须正确否则会报找不到输入输出节点。确认模型里不包含 NMS。export.py 默认只导出前向网络但如果你改了代码把 NMS 包进去了ATC 转换大概率会失败或者转出来的模型性能极差。如果你用的是 YOLOv8导出命令类似yolo export modelyolov8s.pt formatonnx opset11 imgsz640。输入节点名一般是images输出节点名是/model.22/Concat_output_0。后处理同样放到 CPU 侧。4.2 ATC 转换命令逐参数拆解环境配好后在安装了开发环境的终端里执行atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_om \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --logerror这里每个参数的含义我都说清楚--framework5表示输入模型是 ONNX。这是固定值别改成别的数字。--soc_versionAscend310P3是 SoC 版本。Atlas 300V 24G 上就是Ascend310P3。如果你用Ascend310转出来的 OM 在 300V 上加载会直接报错。--input_shapeimages:1,3,640,640固定输入 batch 为 1。如果你计划大 batch 推理可以写成images:8,3,640,640。这里提醒一句转换时定的 batch 就固定了运行时想改小可以想改大会报错。--logerror只在出错时打印日志。转换失败时建议改成--logdebug日志会详细很多但文件也大定位完再改回来。转换成功后会生成yolov5s_om.om文件这就是能在 NPU 上跑的最终模型。4.3 用 AIPP 减少 CPU 端预处理很多教程会把图像缩放、减均值、归一化放在 CPU 端做但 CANN 提供了一种叫 AIPPAI PreProcessing的能力可以把这些操作在 NPU 上完成。方式是在转换时通过--insert_op_confaipp.cfg传入一个配置文件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 min_chn_0: 0 min_chn_1: 0 min_chn_2: 0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }核心逻辑是输入图像是 RGB888 的 uint8 数据不做通道交换把每个通道减 0 再乘 1/255就完成了归一化。这样 CPU 端只需要做 letterbox 得到 640x640 的图然后把二进制数据直接传给 NPU。AIPP 的代价是输入尺寸必须是静态的src_image_size_w/h 固定且无法在运行时随意改。所以如果你要同时跑多种分辨率建议不用 AIPP统一在 CPU 端做预处理。4.4 转换报错怎么办我建模转 YOLO 时最常见的报错是E10001: Input node not found输入节点名错了用 Netron 重新确认。E40001: Unsupported opONNX 里有 ATC 不支持的算子最常见的是 NMS、部分自定义算子。解决办法就是回头把模型简化只保留标准卷积和激活。E19999: Internal error这种报错信息太笼统建议先用 onnxsim 简化模型pip install onnxsim onnxsim yolov5s.onnx yolov5s_sim.onnx再用简化后的文件做 ATC。亲身经历很多莫名其妙的转换失败都是 ONNX 里冗余 shape 算子导致的onnxsim 能解决一大半。5. 写推理代码从加载 OM 到输出检测框模型转换完成只是开始真正让业务跑起来靠的是 PyACL 推理代码。这一节直接给一个精简但完整的流程函数名以 pyACL 官方 API 为准在你自己的环境里稍微调整即可。5.1 初始化与设备绑定import acl acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0)这个set_device(0)表示使用第 0 张 NPU 卡。如果机器上插了多张 300V需要为每个进程绑定不同的设备号否则会资源冲突。5.2 加载 OM 模型并获取输入输出描述model_path yolov5s_om.om # 加载模型返回 model_id model_id, ret acl.mdl.load_from_file(model_path) # 获取模型描述 model_desc, ret acl.mdl.create_desc() acl.mdl.get_desc(model_desc, model_id) # 获取输入输出数量 input_size acl.mdl.get_num_inputs(model_desc) output_size acl.mdl.get_num_outputs(model_desc)这里必须强调传给 NPU 的输入/输出内存不能用普通 numpy 的数组必须通过 acl.rt.malloc 分配。这是因为昇腾的内存管理由 runtime 统一维护需要申请设备侧可访问的物理内存。# 获取输入尺寸假设第一个输入是 1x3x640x640 float32 input_data_size 1 * 3 * 640 * 640 * 4 output_data_size 25200 * 85 * 4 # YOLOv5s 的输出25200 个候选框85 维 input_ptr, ret acl.rt.malloc(input_data_size, 2) output_ptr, ret acl.rt.malloc(output_data_size, 2) # 创建数据缓存 input_buffer, ret acl.util.np_to_ptr(input_np) acl.rt.memcpy(input_ptr, input_data_size, input_buffer, input_data_size, 1)acl.rt.malloc的第二个参数是内存属性2 表示普通内存acl.rt.memcpy最后一个参数 1 表示 H2D 拷贝即从主机内存拷到设备内存。5.3 前处理letterbox 是关键YOLO 训练时的输入通常是 640x640但原始视频帧比例不一定是正方形直接 resize 会导致目标变形检测精度下降。正确做法是 letterbox等比缩放图像把长边缩放到 640短边补灰边到 640。我最初偷懒直接 resize结果 mAP 掉了三四个点跑出来的框也不准后来改回 letterbox 才恢复正常。这一步不能省。import cv2 import numpy as np def letterbox(img, size(640, 640), fill114): h, w img.shape[:2] ratio min(size[0] / h, size[1] / w) nh, nw int(h * ratio), int(w * ratio) resized cv2.resize(img, (nw, nh), interpolationcv2.INTER_LINEAR) canvas np.full((size[0], size[1], 3), fill, dtypenp.uint8) top (size[0] - nh) // 2 left (size[1] - nw) // 2 canvas[top:top nh, left:left nw] resized return canvas, ratio, left, top前处理后转成 NCHW 布局的 float32 数组除以 255 归一化然后拷贝进 input_ptr。5.4 执行推理ret acl.mdl.execute(model_id, input_data_addr, output_data_addr)如果是同步执行调用完 output_data 就是模型输出数据。实际部署中更推荐用异步接口acl.mdl.execute_async配合 stream 和 callback 使用这样可以一边跑 NPU 一边做 CPU 后处理吞吐能提高不少。5.5 后处理解析输出、置信度过滤与 NMSYOLOv5 的输出排布是[1, 25200, 85]其中 25200 3 个尺度80x80 40x40 20x20乘以 3 个 anchor85 4 个框坐标 1 个目标置信度 80 个类别置信度。解析逻辑是把 25200 个候选框逐个读取先用 object confidence 过滤掉低置信度的框再用类别置信度确定类别最后做 NMS 去掉重复框。import torch def postprocess(preds, conf_thres0.5, iou_thres0.45): preds preds.squeeze(0).cpu().numpy() # [25200, 85] boxes, scores, class_ids [], [], [] for pred in preds: obj_conf pred[4] if obj_conf conf_thres: continue cls_conf obj_conf * pred[5:].max() if cls_conf conf_thres: continue cls_id pred[5:].argmax() boxes.append([pred[0] - pred[2]/2, pred[1] - pred[3]/2, pred[0] pred[2]/2, pred[1] pred[3]/2]) scores.append(cls_conf) class_ids.append(cls_id) if len(boxes) 0: return [], [], [] keep torchvision.ops.nms(torch.tensor(boxes), torch.tensor(scores), iou_thres) return [boxes[i] for i in keep], [scores[i] for i in keep], [class_ids[i] for i in keep]注意这里输出的坐标是相对 640x640 的记得用前面 letterbox 的 ratio 和 pad 换算回原始图像坐标。5.6 资源释放推理结束后依次释放acl.rt.free(input_ptr) acl.rt.free(output_ptr) acl.mdl.unload(model_id) acl.rt.destroy_context(context) acl.rt.reset_device(0) acl.finalize()不释放内存的话长时间运行会越跑越慢最终把 NPU 内存耗尽新增推理请求会直接失败。6. 实测性能与避坑记录怎么判断这张卡真的在高效率工作6.1 npu-smi 监控让数据告诉你卡在跑没跑部署完成后先别急着上业务用npu-smi info观察几个关键指标算力利用率AICore、内存使用量、功耗、温度。我实测跑单路 YOLOv5s 时AICore 利用率经常只有 30% 左右这其实是正常现象——单路请求喂不饱芯片。想要追高利用率需要上多 batch 或多路并发。如果你用npu-smi info发现算力利用率一直是 0但推理结果正常大概率是监控采样时间太短或者推理间隔太长。可以用轮询脚本每 0.5 秒采样一次统计一段时间内的平均利用率。6.2 性能预期单路与多路吞吐量级基于我自己的实际测试Atlas 300V 24G 跑 640x640 输入的 YOLOv5s单 batch 的纯 NPU 推理时延在 3ms 上下加上前后处理后整体端到端时延大概 8-15ms取决于 CPU 后处理效率。如果使用 batch8单路时延会上升但单位时间处理图片数量能提升 2 倍以上。我做过的粗略对比模式端到端时延吞吐量约单 batch 串行10ms/张100 FPSbatch8 并发25ms/批200 FPS多路进程并行各 15ms150 FPS实际数值和 CPU 性能、Python 后处理优化程度强相关但顺序基本一致合并 batch 是提升吞吐最有效的手段。6.3 我踩过的三个实际运行坑第一AIPP 静态模式和多尺寸输入的冲突。我一开始想用 AIPP 省 CPU 预处理同时又想支持 1920x1080 原图输入结果模型转换时固定了 640x640 输入直接喂大图会报错或截断。最后选择固定 640 输入、CPU 端做 letterbox。第二内存泄漏。初期版本没有释放 output_ptr跑了一晚上npu-smi 显示内存占用从 2GB 涨到 20GB最后所有新推理请求全部超时。加上释放逻辑后内存稳定。第三验证时容易被假成功误导。model.execute 返回 0 不代表检测结果正确我遇到过输出 tensor 全为 0 的情况后来发现是输入数据 HWC 和 NCHW 顺序搞反了。建议先用一个已知图像检测一遍确认框的位置大概合理再上业务。6.4 性能优化方向异步推理与流水线如果 100 FPS 不能满足需求下一步优化方向是流水线。把前处理放到一个线程NPU 推理放到另一个线程后处理再单独一个线程三个环节之间用队列衔接。这样前处理和 NPU 推理可以并行整体吞吐能再上一个台阶。这部分代码不复杂但要注意 ACL 的 context 是线程绑定的。不同线程用同一个 context 时要加锁或者为每个线程创建独立 context。我建议主线程创建 context工作线程复用只有一个线程执行 execute避免踩到线程安全问题的坑。7. 如果你正打算从零开始部署 Atlas这几条建议能帮你少走弯路文章最后分享几个我这次折腾下来最想告诉后来人的经验。第一先跑通官方示例再碰自己的模型。不要急着把自己的 YOLO 权重丢进去转换先跑通 resnet50 之类的官方 OM 推理示例确认环境、工具链、推理代码都没问题再切到 YOLO。这样能明确区分是环境问题还是模型适配问题排查起来事半功倍。第二转换环节的所有参数要记录在案。包括 ATC 的 soc_version、input_shape、AIPP 配置、onnxsim 版本全部记录下来。否则过几周模型要重新转你会发现自己完全不记得当时怎么转的。我吃过这个亏重转时因为 soc_version 写错多花了一晚上。第三整个推理链路中真正难的不是 NPU 推理而是前后处理的正确性。很多人把大量时间花在 ATC 报错上但最终检测精度不对、框偏移、类别错乱基本都是 letterbox 参数、坐标换算、归一化这些 CPU 侧的逻辑问题。建议在 GPU 上先编写并验证完整的预处理-后处理逻辑再无缝切换到 NPU。第四保存好你的 ONNX、原始 PyTorch 权重和 ATC 日志。OM 文件本身不好排查问题一旦线上有问题需要回退到 ONNX 或原始权重重新分析。日志里往往隐藏着大量线索转换失败时优先看 atc 日志而不是到处搜报错。从我个人的实际使用感受来说Atlas 300V 24G 是一张定位非常精准的推理卡硬件规格在同价位产品里很有竞争力真正的学习成本全在软件工具链上。但只要理解了模型转换 - 内存管理 - 前后处理分离这条主链路部署 YOLO 这类检测模型并不是什么难事。希望这篇文章能帮你少踩几个坑。
RELATED

相关推荐

无刷驱动器选型指南:FOC控制与电机驱动成本深度解析

无刷驱动器选型指南:FOC控制与电机驱动成本深度解析

前言:无刷与有刷的选型博弈在工控设备与自动化产线的研发过程中,电机驱动方案的选型往往是工程师们最纠结的环节之一。面对有刷驱动器“便宜、简单”与无刷驱动器“贵、复杂”的矛盾,很多工程师都会问:到底值不值得多花这笔钱&…

📅 2026/9/25 19:36:48
Atlas 300V 24G部署YOLOv8:从环境搭建到推理落地全流程

Atlas 300V 24G部署YOLOv8:从环境搭建到推理落地全流程

"atlas"这个词最近在AI推理圈子里出现的频率实在太高了。我这边技术交流群几乎每隔两天就会有人问"atlas部署yolo到底怎么搞""atlas 300v 24g是运算加速卡吗"这类问题。作为一个从昇腾310一路折腾到Atlas 300V的老用户,今天干脆把手上…

📅 2026/9/25 19:36:48
Netty Pipeline 与 Handler 体系详解

Netty Pipeline 与 Handler 体系详解

Netty Pipeline 与 Handler 体系详解 定位:Netty 第 03 篇,Pipeline 结构、Handler 与 Context、事件传播机制与编解码接入全解 适用版本:Netty 4.1.x(JDK 8) 目录 ChannelPipelineChannelHandler 与 Context事件传播…

📅 2026/9/25 19:36:48
MORE NEWS

更多资讯

📰

羊行为识别数据集 | 羊行为识别 智慧畜牧 动物福利 进食检测 卧息识别9112期

羊行为识别数据集 | 羊行为识别 智慧畜牧 动物福利 进食检测 卧息识别9112期 数据集概述 本数据集专注于养殖场景下羊只行为状态的视觉识别,服务于智慧畜牧、动物福利评估及牧场精细化管理。数据涵盖三种典型行为类别,适配行为监测、健康预警及管理决策…

📰

fault __bad_area_nosemaphore

__bad_area_nosemaphore 是 x86 架构缺页异常处理中,专门处理那些“没有关联 vm_area_struct(VMA)”的无效地址访问的核心函数。当内核判定某个地址访问完全非法,无法通过常规的 VMA 查找来修复时,就由它来负责决定下一…

📰

企业级AI平台与Agent生态落地:架构、机制与实操指南

1. 企业级AI平台与Agent生态到底在解决什么问题1.1 从一个真实困境说起去年下半年,我帮一家两百多人规模的软件公司做研发效能咨询。他们的技术负责人跟我吐槽了一个很典型的问题:公司买了某款AI编程助手的企业版,给八十多个研发都开了账号&a…

📰

Multipass PR 产物(Artifacts)安装与测试指南:从 CI 包到本地验证

虚拟化开发工具云原生 【免费下载链接】multipass Multipass orchestrates virtual Ubuntu instances 项目地址: https://gitcode.com/gh_mirrors/mu/multipass 点击查看 免费下载 导读:Multipass 的 CI 每天都会为每个 Pull Request 构建出可直接安装的…

📰

UWP 凭据获取实战:Windows-universal-samples 中 CredentialPicker 的三种提示场景与完整选项配置

示例工程 【免费下载链接】Windows-universal-samples API samples for the Universal Windows Platform. 项目地址: https://gitcode.com/gh_mirrors/wi/Windows-universal-samples 点击查看 免费下载 本文基于 Windows-universal-samples 仓库中的 CredentialPic…

📰

Lottery 抽奖系统实战:Docker 部署 XXL-JOB 分布式任务调度中心

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬