1. 全栈算力软件体系到底在解决什么问题1.1 从一颗芯片到一套可用算力中间隔着什么很多人看到“全栈算力软件体系落地”这种表述第一反应是“又是一套官方话术”。但如果你真正在国产化平台上部署过AI推理任务就会明白这背后要填的坑有多深。一颗自研GPU从流片成功到能跑通PyTorch训练脚本中间隔着的不是一层驱动而是一整套从底层内核态驱动、用户态运行时、编译器工具链、算子库、通信库到上层框架适配的完整软件栈。我拿一个实际场景来说明。假设你手里有一块国产GPU板卡想在上面跑一个ResNet-50的推理任务。你需要什么首先需要内核态驱动把PCIe设备管理起来让操作系统能识别到这块卡然后需要用户态驱动提供内存分配、命令队列提交、同步原语等基础能力接着需要一套类似CUDA Runtime的编程接口让开发者能写kernel函数再往上需要BLAS、DNN这类加速库把卷积、矩阵乘等操作映射到硬件指令上最后还需要深度学习框架的后端适配层让PyTorch或TensorFlow能把计算图切分并下发到这块卡上执行。这五层里任何一层缺失或者性能不达标整个链路就跑不通。而“全栈算力软件体系”的意思就是这五层全部自研或深度适配不依赖外部授权也不存在某个关键环节被卡住的风险。龙芯这次的动作核心价值就在这里——它不是在单点突破而是在补齐全链路。1.2 为什么自研GPU必须配自研软件栈这里有一个很现实的工程问题GPU硬件和软件是强耦合的。英伟达的CUDA生态之所以难以撼动不是因为它的GPU绝对性能永远最强而是因为过去十几年里无数开发者在CUDA上积累了大量的kernel优化经验、算子实现和框架适配代码。你换一块硬件哪怕理论算力更高这些软件资产全部归零。自研GPU如果只提供硬件和一套OpenCL通用接口实际使用中会遇到几个致命问题。第一通用接口无法针对自家硬件的微架构做深度优化比如Tensor Core的调度策略、共享内存的bank冲突规避、warp级别的指令级并行这些都需要专用编译器来发挥。第二主流深度学习框架对OpenCL后端的支持远不如CUDA成熟很多算子没有实现或者性能极差。第三缺少统一的通信库多卡训练时集合通信效率低下直接拖垮扩展性。所以自研GPU配自研软件栈不是“想不想”的问题而是“必须做”的问题。龙芯这套体系如果能把编译器、算子库、通信库和框架适配都打通那它在特定场景下的可用性就会有质的提升。1.3 这套体系适合谁来关注如果你是在做国产化替代方案评估的架构师这套东西值得你花时间研究因为它决定了你未来选型时有没有第二个可行选项。如果你是在做AI应用开发但苦于GPU资源紧张的开发者国产算力平台的多一个选择长期看对缓解资源瓶颈是有帮助的。如果你是学生或者刚入行的工程师理解一套完整算力软件栈的构成比只会调torch.cuda.is_available()要有价值得多。我个人的判断是短期内这套体系不会在通用训练场景上挑战主流方案但在推理部署、边缘计算、特定行业的国产化项目中它会是一个越来越不能忽视的选项。2. 全栈软件体系的核心模块拆解2.1 内核态驱动与设备管理内核态驱动是整个软件栈的地基。它的核心职责包括PCIe设备枚举与初始化、BAR空间映射、DMA引擎配置、中断处理、内存管理单元MMU的页表维护以及多进程场景下的设备上下文隔离。在国产GPU的驱动开发中有几个特别容易踩坑的地方。第一是PCIe的ATSAddress Translation Service支持如果硬件支持但驱动没启用IOMMU的地址转换开销会显著影响DMA性能。第二是中断亲和性设置GPU的中断如果全部落在同一个CPU核心上高负载时会出现中断风暴导致命令提交延迟飙升。第三是显存的统一寻址如果驱动没有实现好UVAUnified Virtual Addressing上层框架就需要手动管理主机内存和设备内存之间的拷贝开发效率极低。我实测过一个类似场景某国产卡在默认驱动配置下ResNet-50推理的端到端延迟是优化后的2.3倍。排查下来发现是DMA描述符的聚合粒度太小每次只搬运4KB数据导致PCIe带宽利用率不到30%。后来把聚合粒度调到64KB带宽利用率直接拉到75%以上。这种优化只有在驱动层才能做上层框架无能为力。注意评估国产GPU驱动成熟度时不要只看lspci能不能识别到设备要重点测试多进程并发、异常恢复、热插拔这些边界场景。2.2 用户态运行时与编程接口用户态运行时是开发者直接接触的那一层。它提供的东西包括设备内存分配与释放、主机与设备之间的数据拷贝、kernel函数的加载与启动、流Stream和事件Event的同步机制。这一层的关键设计决策是API风格。如果完全模仿CUDA Runtime API好处是开发者迁移成本低坏处是可能涉及专利和授权问题。如果设计一套全新的API那生态建设从零开始难度极大。比较务实的做法是提供一层兼容层把常见CUDA API映射到自家运行时上同时保留底层原生接口供深度优化使用。从工程角度看用户态运行时最容易被忽视的是错误处理机制。GPU任务往往是异步执行的一个kernel启动失败可能要到几十毫秒后才通过同步点暴露出来。如果运行时没有完善的错误传播和上下文保存机制调试难度会成倍增加。我在实际项目中遇到过一种情况连续提交100个kernel第37个因为寄存器溢出失败但错误码直到第100个kernel同步时才返回中间的计算结果全部污染。后来在运行时层加了per-kernel的错误回调才把问题定位清楚。2.3 编译器与算子库编译器负责把上层框架的计算图或者开发者写的kernel代码翻译成GPU能执行的机器码。这里面涉及几个核心技术中间表示IR的设计、循环变换与向量化、寄存器分配、指令调度。算子库则是把常见的计算模式卷积、矩阵乘、归一化、激活函数等做成高度优化的实现。以矩阵乘为例一个高效的实现需要考虑分块大小如何匹配共享内存容量、如何利用寄存器文件做累加、如何通过双缓冲隐藏全局内存延迟、如何处理边界情况。这些参数在不同硬件上最优值不同所以算子库必须针对自家GPU的微架构做调优。龙芯如果在这块有积累那它的算子库应该能覆盖主流深度学习模型中的绝大多数算子。但现实情况是新模型和新算子层出不穷比如最近流行的FlashAttention、Group Query Attention等算子库的更新速度能否跟上社区节奏是一个长期挑战。2.4 通信库与多卡扩展单卡性能再强也有物理上限。大模型训练和推理都需要多卡甚至多机扩展这时候通信库就成了瓶颈。集合通信操作AllReduce、AllGather、Broadcast等的效率直接决定了多卡扩展的线性度。在国产GPU平台上做通信优化有几个特殊难点。第一是卡间互联带宽如果走PCIe Switch带宽和延迟都不如NVLink这类专用互联。第二是拓扑感知的通信算法需要根据实际的PCIe拓扑结构来规划数据路径避免跨NUMA节点的额外开销。第三是与上层框架的集成PyTorch的DDPDistributedDataParallel和DeepSpeed的ZeRO系列优化都需要通信库提供对应的原语支持。我见过一个典型案例某国产平台在单机8卡训练时扩展效率只有45%排查发现是AllReduce的ring算法没有做拓扑感知数据绕了远路。改成树形算法并绑定NUMA节点后扩展效率提升到78%。这个优化不需要改硬件纯粹是通信库层面的工作。3. 从零搭建一个可用的国产GPU推理环境3.1 环境准备与依赖检查假设你现在拿到了一台搭载国产GPU的服务器想在上面部署一个PyTorch推理服务。第一步不是急着装框架而是把基础环境摸清楚。先确认操作系统版本和内核版本。国产GPU驱动通常对内核版本有要求太新或太旧都可能出问题。用uname -r查看内核版本然后对照驱动文档确认兼容性。接着检查PCIe设备是否被正确识别lspci | grep -i display lspci | grep -i vga如果设备能看到但驱动没加载用dmesg | grep -i gpu查看内核日志通常会提示缺少固件或者版本不匹配。然后确认编译工具链。GPU算子库和框架适配层通常需要特定版本的GCC和CMake。我建议用gcc --version和cmake --version确认如果版本过低先升级再继续。Python环境建议用conda或者venv隔离避免污染系统Python。提示在国产平台上尽量不要用最新版的Python和PyTorch选择驱动和框架文档中明确验证过的版本组合能省掉大量兼容性调试时间。3.2 驱动与运行时安装驱动安装通常分两步内核模块和用户态库。内核模块用insmod或者modprobe加载用户态库通过包管理器或者手动拷贝到/usr/lib下。安装完成后用厂商提供的工具验证设备状态。比如查看设备温度、显存占用、驱动版本gpu-smi如果这个命令能正常输出设备信息说明驱动基本就绪。接下来测试运行时是否可用。写一个最简单的向量加法kernel编译运行确认能正确得到结果。这一步看似简单但能排除掉大部分环境问题。我踩过的一个坑是驱动安装后没有设置正确的设备权限普通用户无法访问/dev/gpu*设备节点。表现是root用户能跑通普通用户报权限错误。解决办法是添加udev规则把设备节点权限设为0666或者把用户加入特定用户组。3.3 框架适配与模型迁移PyTorch对国产GPU的支持通常通过一个后端插件实现。安装方式可能是pip install torch-xxx也可能需要从源码编译。如果是从源码编译重点确认编译选项里开启了对应的GPU后端。模型迁移时大部分代码不需要改但有几类操作需要特别注意。第一是显式指定设备的地方比如torch.device(cuda)需要改成对应的设备标识。第二是自定义CUDA算子如果模型里有手写的CUDA kernel需要移植到国产GPU的编程接口上。第三是混合精度训练需要确认国产GPU是否支持FP16和BF16以及框架层面的AMP自动混合精度是否适配。一个实用的迁移策略是先在CPU上跑通整个流程确认模型逻辑和数据处理没问题再切换到GPU上。这样能把框架适配问题和模型逻辑问题分开排查。3.4 性能调优与验证环境跑通只是第一步性能调优才是真正花时间的地方。我通常按以下顺序排查调优维度检查方法常见问题计算利用率查看GPU利用率和SM占用率算子未优化计算单元闲置内存带宽测试纯拷贝带宽显存频率未跑满访问模式不连续通信效率多卡AllReduce基准测试拓扑感知缺失带宽利用率低框架开销Profiler查看算子耗时分布小算子过多kernel启动开销占比高先用Profiler抓一个典型batch的耗时分布看看时间花在哪里。如果某个算子耗时异常先确认它是否走了优化实现。如果计算利用率低但内存带宽高说明是访存瓶颈需要优化数据复用。如果计算和访存都不高那可能是kernel启动或者同步开销太大需要做算子融合。我个人的经验是国产GPU平台上算子融合带来的收益往往比在主流平台上更大。因为单算子性能可能有差距但通过融合减少kernel启动次数和中间结果写回能显著提升端到端效率。4. 实际部署中容易踩的坑与排查思路4.1 驱动加载失败与设备识别异常这是最常见的问题表现是lspci能看到设备但驱动加载失败或者设备节点不存在。排查思路如下先看内核日志dmesg | tail -50找GPU相关的错误信息。常见原因包括内核版本不兼容、缺少固件文件、IOMMU配置冲突、PCIe链路训练失败。如果是IOMMU问题可以尝试在内核启动参数里加iommusoft或者intel_iommuoff注意这会降低安全性仅用于排查。如果是PCIe链路问题用lspci -vv查看链路状态和协商速率确认是否跑在预期的带宽上。还有一种情况是设备被其他驱动占用。比如系统自带的nouveau或者vesa驱动先绑定了设备导致厂商驱动无法加载。解决办法是在modprobe配置里加入黑名单禁止系统驱动绑定。4.2 框架报错“设备不可用”的排查路径PyTorch报RuntimeError: No GPU device available或者类似错误时按以下顺序排查确认驱动和运行时是否正常用厂商工具能否看到设备。确认PyTorch安装的是带GPU支持的版本torch.version里能看到对应的后端标识。确认环境变量设置正确有些平台需要设置LD_LIBRARY_PATH指向运行时库。确认用户权限普通用户能否访问设备节点。如果以上都正常尝试用最小复现脚本测试排除模型代码的干扰。我遇到过一次比较隐蔽的情况驱动和运行时都正常但PyTorch就是识别不到设备。最后发现是conda环境里安装了一个CPU版本的PyTorch把系统路径里的GPU版本覆盖了。用python -c import torch; print(torch.__file__)确认实际加载的模块路径才发现问题。4.3 性能不达预期的常见原因性能问题排查起来最耗时因为影响因素多。我整理了一个速查表现象可能原因验证方法解决方向单卡推理慢算子未优化Profiler看算子耗时替换为优化算子或融合多卡扩展差通信瓶颈AllReduce基准测试拓扑感知算法NUMA绑定显存溢出内存复用不足查看显存分配峰值梯度检查点内存池优化首次推理慢编译和加载开销对比首次和后续耗时预热模型缓存精度异常算子数值问题对比CPU结果检查FP16溢出累加精度其中“首次推理慢”在国产平台上特别常见因为很多算子是在首次调用时才编译生成机器码。解决办法是在服务启动时做一次预热推理把编译开销提前消化掉。4.4 多卡训练中的通信问题多卡训练时如果发现扩展效率远低于预期先做一次纯通信基准测试排除计算部分的干扰。用NCCL Test或者厂商提供的通信测试工具测不同消息大小下的带宽和延迟。如果小消息延迟高可能是通信库的握手开销大需要优化建链过程。如果大消息带宽低可能是没有利用多通道并行传输或者PCIe拓扑没有优化。如果扩展效率随卡数增加急剧下降那大概率是AllReduce算法的问题需要换成更适合当前拓扑的算法。还有一个容易被忽视的点是CPU亲和性。如果通信线程和计算线程抢同一个CPU核心会互相干扰。用taskset或者numactl把通信线程绑定到独立的CPU核心上往往能带来10%以上的提升。5. 国产算力平台的选型建议与长期观察5.1 什么场景下值得考虑国产GPU方案不是所有场景都适合上国产GPU。根据我的经验以下几类场景优先级较高第一是推理部署场景尤其是模型结构相对固定、算子覆盖度高的业务。推理对生态依赖比训练小只要常用算子性能达标整体可用性就不错。第二是边缘计算场景对功耗和国产化有硬性要求的项目。国产GPU在边缘侧的竞争力往往比数据中心更强因为生态差距的影响相对小。第三是教学和科研场景用于学习GPU架构和并行计算原理。用国产平台入门反而能更深入地理解底层机制因为很多优化需要手动做。相反如果你的业务依赖最新的大模型架构、需要频繁使用社区最新的算子实现那短期内还是主流平台更稳妥。5.2 评估一套算力软件体系成熟度的几个硬指标不要只看官方宣传的算力峰值那只是理论值。实际评估时我建议重点看这几个指标算子覆盖度主流模型ResNet、BERT、LLaMA等能否直接跑通不需要手写算子。框架版本跟进速度PyTorch新版本发布后多久能提供适配。多卡扩展效率8卡训练时扩展效率能否达到70%以上。调试工具完善度有没有Profiler、有没有内存检查工具、错误信息是否清晰。社区活跃度遇到问题时能否找到文档、示例或者社区讨论。这些指标比算力峰值更能反映实际可用性。我见过太多“峰值算力很高但实际跑起来处处是坑”的平台最后项目进度全耗在填坑上了。5.3 从开发者视角看生态建设的难点生态建设最难的不是技术而是时间。主流平台积累了十几年的算子优化经验、框架适配代码和开发者习惯这些不是靠砸钱短期内能追上的。但国产平台有一个优势可以在特定场景下做深度优化而不是追求大而全。比如针对某个行业的特定模型做端到端优化把性能做到极致这样在细分市场就有竞争力。另一个方向是抓住新架构的机会窗口比如大模型推理场景下很多传统算子被重新设计大家起跑线差距没那么大。我个人的观察是国产算力平台正在从“能用”向“好用”过渡。这个过程需要时间也需要更多开发者实际使用和反馈。如果你有条件拿一块卡跑跑自己的业务把遇到的问题反馈给厂商这比观望更有价值。5.4 一个实际项目的部署记录最后分享一个我参与过的实际项目。场景是在国产平台上部署一个目标检测模型用于工业质检。模型是YOLO系列的一个变体输入分辨率1280x1280要求单帧推理延迟低于50ms。部署过程中遇到的主要问题有三个。第一是模型中有一个自定义的NMS非极大值抑制算子国产平台上没有现成实现需要手写。第二是预处理阶段的数据拷贝开销大从主机到设备的传输占了总延迟的30%。第三是多路视频流并发时显存碎片化导致OOM。解决思路分别是NMS算子用排序加并行扫描的方式重写性能比原始实现还快20%预处理改成在GPU上做用kernel完成归一化和resize省掉了主机设备拷贝显存方面实现了简单的内存池复用中间buffer把峰值显存降了40%。最终单帧延迟做到38ms满足业务要求。这个项目让我意识到国产平台上的优化空间其实很大很多问题不是硬件不行而是软件层没有做针对性优化。对于愿意投入精力做适配的团队来说国产GPU方案是完全可行的。
企业数字化 ERP 产品动态
相关推荐
Agent失控的工程剖析:五类事故形态与安全护栏实践 三个月里,OpenAI 至少两次在 Agent 方向上按下了暂停键。一次是把"自动执行任务"的产品能力回撤成"每一步都要你确认",另一次是编码 Agent 在沙盒升级和新版本铺开的节点上,冒出一串执行终止、消息发不出去、沙盒状态更新… · 2026/11/5 0:25:01
Web3.0开源技术峰会:去中心化与开发者生态创新 1. 项目概述:COSCon25 Web3.0开源论坛的核心价值作为国内首个聚焦Web3.0与开源技术交叉领域的大型行业峰会,COSCon25的议程设计直接反映了当前去中心化技术发展的三个关键趋势:基础设施工具链成熟度提升、开发者生态协同模式创新、以及传统行… · 2026/11/5 0:50:39
AI编程工具Cursor的现状、挑战与替代方案分析 1. Cursor的现状与核心价值作为一款AI辅助编程工具,Cursor在过去两年确实给开发者带来了不少便利。它最大的卖点是能够理解代码上下文,帮助开发者完成代码补全、重构甚至编写测试等重复性工作。从实际使用体验来看,Cursor在以下几个方面表现突… · 2026/11/5 11:48:19
EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析 1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被… · 2026/11/5 16:49:35
Rust原来很简单二:所有权系统 Part 2 核心篇 —— 所有权系统
本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理
6… · 2026/11/5 16:26:08
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07