苹果M1/M2芯片跑自监督学习:统一内存与Metal后端实战指南

news2026/5/22 8:36:21
1. 项目概述为什么苹果自研芯片正在悄悄改写AI训练的底层逻辑最近三个月我陆续在三台不同配置的Mac上跑通了SimCLR、BYOL和MoCo v3这三套主流自监督学习SSL模型的完整训练流程——不是跑个demo而是用ImageNet-1K子集50k张图完成从预训练到线性评估的全链路验证。核心发现很反直觉一台2020款M1 MacBook Air8GB统一内存在训练ResNet-50 backbone的SimCLR时单epoch耗时仅比2022款M2 Pro16GB慢12%而功耗稳定在18W左右全程风扇几乎不转更关键的是当把batch size从256提升到512时M1的吞吐量衰减率19%远低于同价位NVIDIA RTX 4060笔记本47%。这背后不是简单的“苹果芯片变快了”而是统一内存架构、神经引擎调度机制与PyTorch Metal后端深度耦合后产生的系统级增益。如果你正面临这些现实困境想在家用设备做轻量级SSL预训练但被CUDA环境折腾得焦头烂额需要快速验证新提出的对比学习损失函数却苦于没有GPU服务器权限或者正在为边缘设备部署SSL模型寻找低功耗推理方案——那么这篇基于实测数据的深度拆解就是为你写的。它不讲虚的“M1有多强”只聚焦一个硬核问题在真实SSL训练场景中M1/M2到底能做什么、不能做什么、为什么这样设计、以及如何绕过那些官方文档里绝不会提的隐藏瓶颈。2. 核心技术架构解析统一内存、神经引擎与Metal后端的三角博弈2.1 统一内存架构对SSL训练的双重影响SSL模型训练最消耗内存的环节从来不是模型参数本身而是动辄数万张图像的在线数据增强缓存、特征向量队列如MoCo的memory bank、以及多视图对比计算时的中间激活张量。以BYOL为例在batch size512、image size224×224、ResNet-50 backbone下仅两个分支online/target的特征图缓存就需要约3.2GB显存FP16精度若叠加随机裁剪、色彩抖动、高斯模糊等增强操作CPU端预处理缓冲区再占1.8GB——传统x86独立GPU方案中这部分数据必须在PCIe总线两端反复拷贝带宽成为致命瓶颈。而M1/M2的统一内存架构直接消除了这个鸿沟CPU、GPU、神经引擎共享同一块物理内存池所有张量都以虚拟地址映射方式存在无需显式拷贝。我在实测中用vmmap工具追踪BYOL训练过程发现当启用torch.compile(modereduce-overhead)时内存页交换次数下降73%这是吞吐量提升的底层原因。但统一内存不是银弹。它的代价是内存带宽竞争。M1的内存带宽为68.25 GB/sM2提升至100 GB/s而RTX 4060 Laptop的GDDR6带宽为272 GB/s。这意味着当SSL训练进入高并发阶段——比如同时运行数据加载器CPU、特征提取GPU、动量更新CPU、队列维护CPU四个线程时内存控制器会成为争抢焦点。我的测试数据显示在M1上当num_workers4且persistent_workersTrue时数据加载延迟反而上升11%因为CPU核心频繁抢占内存通道导致GPU等待。解决方案不是简单调小num_workers而是采用内存亲和性绑定用taskset -c 0,1,2,3 python train.py将数据加载线程锁定在性能核心Performance Core让效率核心Efficiency Core专供模型计算实测可降低延迟波动38%。2.2 神经引擎ANE在SSL中的真实定位苹果官方宣传中16核神经引擎每秒可执行15.8万亿次运算M2 Pro但这个数字对SSL训练几乎无意义。原因在于神经引擎是为固定模式推理优化的硬件单元其指令集仅支持有限的算子Conv2D、MatMul、ReLU、Softmax等且不支持反向传播所需的梯度计算。在PyTorch中所有涉及backward()的操作都会被自动路由到GPU或CPU神经引擎全程静默。但它在SSL pipeline中有一个不可替代的隐性角色预处理卸载。SSL依赖大量在线数据增强其中高斯模糊、色彩空间转换、随机擦除等操作在CPU上执行效率极低。M1/M2的神经引擎通过Core ML框架提供VNGenerateImageFeaturePrintRequest等API可将部分图像处理任务卸载。虽然PyTorch原生不支持但通过coremltools将预处理模块导出为.mlmodel后用coremltools.models.MLModel调用实测在M2 Max上单张图像的高斯模糊σ1.5耗时从CPU的8.2ms降至1.3ms。我在MoCo v3训练中将此方案集成进CustomDataset的__getitem__方法使数据加载吞吐量提升22%且完全不增加GPU负载。这里的关键技巧是必须将.mlmodel文件放在/tmp目录避免沙盒限制并用os.environ[COREML_USE_MPS] 1强制启用Metal加速。2.3 PyTorch Metal后端从“能跑”到“跑得稳”的临界点2022年11月PyTorch 2.0正式支持Metal后端但直到2023年8月的2.1.0版本才解决SSL训练中最致命的两个bugtorch.nn.SyncBatchNorm的跨设备同步失效以及torch.distributed在单机多卡M1 Ultra场景下的梯度聚合错误。当前2024年Q2推荐使用PyTorch 2.3.0 macOS 14.5组合这是经过我72小时压力测试验证的最稳定栈。Metal后端的核心优势在于零拷贝张量管理当张量创建时指定devicemps其内存分配直接在统一内存池中完成后续所有forward/backward操作均在GPU上原地执行。但陷阱在于Metal不支持torch.cuda.amp自动混合精度因此必须手动切换精度。SSL训练中torch.float16会导致对比损失如NT-Xent的数值不稳定——因为指数运算放大微小误差。我的解决方案是分层精度控制主干网络backbone用torch.float16投影头projection head和预测头prediction head强制torch.float32并在损失计算前插入torch.clamp(min1e-7)防止log(0)。实测在SimCLR中该方案使loss曲线收敛稳定性提升40%且不增加显存占用。提示Metal后端目前不支持torch.compile(fullgraphTrue)启用fullgraphFalse默认即可。若遇到RuntimeError: MPS backend out of memory不要盲目增大batch size先检查是否误用了torch.cuda.*API如torch.cuda.empty_cache()这些调用在MPS上会直接崩溃。3. 实操全流程拆解从环境搭建到线性评估的完整链路3.1 环境配置避开Apple Silicon的三大经典坑很多开发者卡在第一步pip install torch后运行torch.device(mps)报错。这不是PyTorch问题而是macOS系统级限制。以下是经过27次重装验证的黄金配置流程系统准备必须升级至macOS Sonoma 14.5非Ventura因为14.4之前的版本存在Metal驱动内存泄漏持续训练超4小时后GPU利用率会骤降至10%。用sw_vers确认版本softwareupdate --install-rosetta安装Rosetta 2某些旧版OpenCV依赖。Python环境放弃Homebrew Python用pyenv安装CPython 3.11.9M1/M2对3.12支持不完善。关键命令pyenv install 3.11.9 pyenv global 3.11.9 pip install --upgrade pip setuptools wheelPyTorch安装严格按官网命令执行禁用任何镜像源pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/macos-arm64验证命令必须包含torch.backends.mps.is_available()和torch.backends.mps.is_built()双检查import torch print(torch.backends.mps.is_available()) # 应输出True print(torch.backends.mps.is_built()) # 应输出True print(torch.device(mps)) # 应输出mpsOpenCV避坑pip install opencv-python会安装x86版本导致崩溃。正确方案是pip uninstall opencv-python opencv-contrib-python brew install opencv # 通过Homebrew安装arm64原生版 pip install opencv-python-headless # 仅安装无GUI依赖的headless版数据加载优化SSL训练中DataLoader是最大瓶颈。必须启用pin_memoryFalseMPS不支持pinned memory并将prefetch_factor设为NoneMetal后端自行管理预取。最终配置模板train_loader DataLoader( dataset, batch_size256, shuffleTrue, num_workers4, # M1建议≤4M2可设6 persistent_workersTrue, pin_memoryFalse, prefetch_factorNone, drop_lastTrue )3.2 SSL模型适配三类主流架构的针对性改造SSL模型并非开箱即用需针对Metal后端特性进行手术式改造。以下是SimCLR、BYOL、MoCo v3的实操要点SimCLR改造重点温度系数temperature的数值稳定性原始SimCLR使用temperature0.1但在MPS上torch.exp(-similarity / temperature)易因FP16精度不足产生inf值。解决方案是动态温度缩放# 替换原始代码中的 loss -torch.log(torch.exp(logits / t) / torch.sum(torch.exp(logits / t), dim1, keepdimTrue)) # 改为 logits_scaled logits / t * 0.5 # 先缩放logits logits_max, _ torch.max(logits_scaled, dim1, keepdimTrue) logits_stable logits_scaled - logits_max # 减去最大值防溢出 exp_logits torch.exp(logits_stable) log_prob torch.log(exp_logits / torch.sum(exp_logits, dim1, keepdimTrue)) loss -log_prob.mean()实测该修改使SimCLR在M1上的loss震荡幅度从±0.15降至±0.03。BYOL改造重点动量编码器momentum encoder的权重同步BYOL要求online encoder和target encoder权重按θ_target m * θ_target (1-m) * θ_online更新但MPS的torch.no_grad()上下文存在梯度跟踪残留。必须在每次更新前强制清空计算图# 在BYOL的update_momentum_encoder()方法中 with torch.no_grad(): for param_q, param_k in zip(self.online_encoder.parameters(), self.momentum_encoder.parameters()): param_k.data param_k.data * self.m param_q.data * (1. - self.m) # 关键清除所有可能的grad_fn引用 for param in self.momentum_encoder.parameters(): if param.grad_fn is not None: param.grad_fn NoneMoCo v3改造重点memory bank的内存布局优化MoCo v3的queue需存储数万条特征向量原始实现用torch.cat([queue, new_feat], dim0)导致频繁内存重分配。改为预分配固定大小的环形缓冲区class MoCoQueue: def __init__(self, feature_dim, queue_size): self.queue_size queue_size self.register_buffer(queue, torch.randn(feature_dim, queue_size)) # MPS兼容的buffer注册 self.register_buffer(queue_ptr, torch.zeros(1, dtypetorch.long)) torch.no_grad() def dequeue_and_enqueue(self, keys): batch_size keys.shape[0] ptr int(self.queue_ptr) # 环形写入自动覆盖最老数据 self.queue[:, ptr:ptr batch_size] keys.T ptr (ptr batch_size) % self.queue_size self.queue_ptr[0] ptr该方案使MoCo v3在M2 Pro上的queue操作耗时从127ms降至8ms。3.3 训练脚本核心参数M1/M2专属调优表参数M18GB推荐值M216GB推荐值调优原理batch_size256512统一内存容量决定上限超过后触发内存压缩导致性能断崖learning_rate0.03线性缩放0.06Metal后端梯度更新延迟略高需稍大LR补偿num_workers46超过此值内存带宽争抢加剧实测吞吐量反降torch.compile(mode)reduce-overheaddefaultM1内存带宽低优先减少启动开销M2带宽高可启用完整优化optimizertorch.optim.LARStorch.optim.AdamWLARS在低batch size下更稳定AdamW在高batch size下收敛更快amp手动分层精度见2.3节同左Metal不支持自动混合精度必须手动控制关键实操细节torch.compile在SSL训练中不是“开就完事”。我测试了三种模式default编译整个模型但SSL的动态batch size如drop_lastTrue时末尾batch变小会导致编译缓存失效每epoch重新编译反而慢15%reduce-overhead仅优化数据加载和基础算子适合M1max-autotune需预热100步适合M2 Pro/Max等高端芯片。3.4 线性评估Linear Evaluation的终极提速方案SSL预训练的价值最终体现在下游任务性能上而线性评估本身也是计算密集型任务。在M1/M2上标准的torch.nn.Linear在1000类ImageNet评估中耗时过长。我的终极提速方案是冻结backbone Metal专用线性层class MetalLinear(nn.Module): def __init__(self, in_features, out_features): super().__init__() # 使用Metal优化的权重初始化 self.weight nn.Parameter(torch.empty(out_features, in_features)) self.bias nn.Parameter(torch.empty(out_features)) self.reset_parameters() def reset_parameters(self): # Metal对权重分布敏感避免极端值 nn.init.kaiming_uniform_(self.weight, amath.sqrt(5)) fan_in, _ nn.init._calculate_fan_in_and_fan_out(self.weight) bound 1 / math.sqrt(fan_in) if fan_in 0 else 0 nn.init.uniform_(self.bias, -bound, bound) def forward(self, x): # 强制使用MPS张量运算 return torch.nn.functional.linear(x, self.weight, self.bias) # 在线性评估脚本中 model ResNet50(pretrainedFalse) model.load_state_dict(torch.load(ssl_pretrained.pth)) for param in model.parameters(): param.requires_grad False # 冻结backbone classifier MetalLinear(2048, 1000).to(mps) # 仅classifier在MPS上该方案使线性评估耗时从原始方案的28分钟M1降至11分钟提速155%。核心原因是MetalLinear避免了PyTorch默认Linear中冗余的梯度检查和形状验证直接调用底层Metal矩阵乘法内核。4. 性能实测数据与场景化决策指南4.1 三类SSL模型在M1/M2上的实测基准我在相同条件下ImageNet-1K子集50k张图、ResNet-50 backbone、FP16精度、batch_size256对三类SSL模型进行72小时连续训练记录关键指标模型芯片型号单epoch耗时100epoch总耗时峰值GPU利用率平均功耗loss收敛稳定性stdSimCLRM1 (8GB)4m 32s7h 32m92%18.3W0.042SimCLRM2 (16GB)3m 18s5h 18m94%21.7W0.028BYOLM1 (8GB)5m 14s8h 42m88%17.9W0.035BYOLM2 (16GB)3m 46s6h 18m91%20.5W0.021MoCo v3M1 (8GB)6m 07s10h 07m85%19.2W0.051MoCo v3M2 (16GB)4m 22s7h 22m87%22.3W0.038注意所有测试均关闭MacBook屏幕pmset displaysleepnow避免图形渲染干扰GPU资源。功耗数据通过powermetrics --samplers smc实时采集采样间隔1s。数据揭示一个关键规律M2相比M1的性能提升并非线性。在计算密集型的SimCLR中M2提速42%但在内存密集型的MoCo v3中提速仅39%说明统一内存带宽仍是瓶颈。更值得注意的是M1的功耗稳定性优于M2——M1在100epoch训练中功耗波动仅±0.8W而M2达±1.5W这意味着M1更适合需要7×24小时稳定运行的轻量级SSL服务。4.2 场景化决策树你的项目该选M1还是M2根据实测数据我构建了面向真实开发场景的决策树。请对照你的需求逐项勾选✓ 你主要做算法研究原型验证→ 选M18GB内存足够跑通SimCLR/BYOL全链路成本仅为M2的60%且散热静音适合实验室桌面长期运行。✓ 你需要训练更大的backbone如ViT-Base→ 必须选M2 Pro及以上ViT-Base在batch_size128时M1的8GB内存会触发系统级内存压缩训练速度暴跌300%M2 Pro的16GB可流畅运行。✓ 你计划部署到边缘设备如iPad或Mac mini→ 选M1M1的神经引擎对Core ML模型支持最成熟将SSL模型转为.mlmodel后在iPad Pro上推理延迟比M2低12%因为M1的ANE频率调度更激进。✓ 你需同时运行多个SSL实验A/B测试→ 选M2 Max其32核GPU可划分多个MPS设备torch.device(mps:0),mps:1实测可并行运行3个batch_size128的BYOL实验总耗时仅比单任务多18%。✗ 你依赖TensorBoard实时可视化→ 暂不推荐M1/M2PyTorch的torch.utils.tensorboard在MPS后端存在日志写入延迟loss曲线更新滞后平均47秒。建议改用wandb或mlflow。4.3 与x86GPU方案的客观对比不是谁更好而是谁更合适很多开发者纠结“该不该放弃NVIDIA”。我的结论是M1/M2不是NVIDIA的替代品而是垂直场景的补充方案。以下是关键维度对比维度M1/M2方案NVIDIA RTX 4060 Laptop适用场景建议初始成本M1 Air $999起整机$1299起预算敏感型个人开发者首选M1功耗效率18-22W整机115WGPU alone需要电池续航或静音环境必选M系列环境复杂度无CUDA/cuDNN依赖pip install即用需手动配置CUDA Toolkit、cuDNN、驱动版本新手或跨平台协作团队首选M系列扩展性单机无法扩展GPU内存上限固定可外接eGPU或升级显卡需要弹性算力的中大型团队选NVIDIASSL特化支持Metal后端对SSL常用算子如NT-Xent loss有底层优化依赖通用CUDA库无SSL专属优化专注SSL研究的实验室可发挥M系列优势分布式训练仅支持单机多卡M1 Ultra无NCCL支持完整支持DDPFSDPDeepSpeed大规模预训练必须选NVIDIA生态特别提醒在SSL的在线数据增强环节M1/M2凭借神经引擎和统一内存实际吞吐量反超RTX 4060。我的测试显示对同一组高斯模糊色彩抖动操作M2 Max的预处理速度是RTX 4060的1.8倍。这意味着如果你的瓶颈在数据流水线而非模型计算M系列可能是更优解。5. 常见问题与独家排障手册5.1 “MPS backend out of memory”错误的七种根因与解法这是M1/M2用户最高频的报错但90%的情况与显存无关。以下是基于72小时debug总结的根因矩阵错误现象真实根因解决方案验证命令训练初期即报错误用torch.cuda.*API全局搜索cuda替换为mps删除torch.cuda.empty_cache()grep -r cuda . --include*.py训练10-20epoch后报错Metal驱动内存泄漏macOS14.5升级至Sonoma 14.5重启Macsw_vers system_profiler SPSoftwareDataType | grep System VersionDataLoader启动时报错num_workers0且未设置pin_memoryFalse在DataLoader中强制添加pin_memoryFalse检查DataLoader参数打印使用torch.compile时报错启用了fullgraphTrue改为torch.compile(modereduce-overhead)查看compile日志中的graph cache miss率加载预训练权重时报错权重文件含cuda设备标记加载时指定map_locationmpstorch.load(model.pth, map_locationmps)检查权重文件的state_dict设备属性多进程训练时报错torch.distributed未正确初始化M1/M2必须用gloo后端torch.distributed.init_process_group(backendgloo)确认torch.distributed.get_backend()返回gloo使用torch.nn.SyncBatchNorm时报错PyTorch版本2.1.0升级至PyTorch 2.3.0torch.__version__关键经验当遇到MPS OOM时第一反应不是调小batch size而是运行powermetrics --samplers smc --show-process-energy --show-process-gpu --show-process-io观察GPU Active和Memory Pressure指标。若Memory Pressure持续80%才是真内存不足若GPU Active30%则是驱动或代码问题。5.2 SSL训练中五个反直觉但有效的提速技巧这些技巧来自我踩过的23个坑官方文档绝不会提技巧1禁用torch.nn.Dropout的随机种子重置SSL训练中Dropout层在每次forward时重置随机种子导致Metal内核无法复用。在模型定义中改为class CustomDropout(nn.Module): def __init__(self, p0.5): super().__init__() self.p p # 固定随机种子避免Metal内核重建 self.register_buffer(mask, torch.ones(1)) def forward(self, x): if self.training: # 使用固定mask仅在首次训练时生成 if not hasattr(self, _mask_generated): self.mask torch.bernoulli(torch.full_like(x, 1 - self.p)) self._mask_generated True return x * self.mask / (1 - self.p) return x技巧2将torch.nn.CrossEntropyLoss替换为手工实现Metal对CrossEntropyLoss的优化不佳。实测手工实现提速22%def mps_cross_entropy(logits, targets): # logits: [B, C], targets: [B] log_probs torch.nn.functional.log_softmax(logits, dim-1) target_log_probs log_probs.gather(1, targets.unsqueeze(1)) return -target_log_probs.mean()技巧3SSL特征归一化的Metal友好写法原始F.normalize(x, dim1)在MPS上慢。改用def mps_normalize(x): norm torch.sqrt(torch.sum(x * x, dim1, keepdimTrue)) return x / (norm 1e-8) # 避免除零技巧4MoCo queue的异步更新将queue更新从训练循环中剥离用threading.Thread后台执行主线程专注计算class AsyncQueueUpdater: def __init__(self, queue): self.queue queue self.lock threading.Lock() def update(self, keys): with self.lock: self.queue.dequeue_and_enqueue(keys)技巧5利用M1/M2的AVX-512加速CPU端操作SSL中仍有CPU密集型任务如label encoding。在Python中启用import os os.environ[VECLIB_MAXIMUM_THREADS] 8 # 强制使用全部CPU核心 # 在数据处理函数中使用numpy的AVX加速 import numpy as np np.set_printoptions(thresholdnp.inf)5.3 线性评估结果可信度验证如何避免“虚假SOTA”很多开发者报告“M1上BYOL准确率比论文高2%”这通常是评估流程缺陷导致的。我的验证清单数据集划分一致性确保使用的ImageNet-1K验证集与论文完全一致。M1/M2用户常误用torchvision.datasets.ImageFolder的默认shuffle导致评估集混入训练样本。正确做法val_dataset datasets.ImageFolder( rootval_dir, transformtransform, is_valid_filelambda x: os.path.basename(x) in val_filenames # 显式指定文件列表 )评估时的精度模式线性评估必须用torch.float32即使预训练用FP16。MPS在FP16下torch.topk存在精度偏差导致top-1准确率虚高。强制转换with torch.no_grad(): features model(images.to(mps)).to(cpu).float() # 先回CPU再转float32 outputs classifier(features)Batch size影响MPS的torch.topk在batch_size100时返回索引顺序异常。评估时必须设batch_size64并用torch.cat拼接结果。随机种子固化SSL评估对随机性敏感。必须固化所有种子torch.manual_seed(42) np.random.seed(42) random.seed(42) torch.backends.mps.deterministic True torch.backends.mps.benchmark False最后分享一个血泪教训我在M1上测出BYOL 72.3% top-1准确率兴奋地写了博客结果被同行指出——我误用了torchvision.models.resnet50(pretrainedTrue)的ImageNet权重作为baseline而SSL评估应使用随机初始化的ResNet-50。修正后真实值为68.1%仍高于论文的67.5%但差距合理。所以永远用torch.nn.init.kaiming_normal_初始化评估模型这是底线。6. 进阶应用从单机训练到边缘部署的完整路径6.1 将SSL模型部署到iPadCore ML转换实战M1/M2训练的SSL模型最大价值在于边缘部署。以下是将BYOL backbone转为iPad可运行Core ML模型的完整流程模型导出准备BYOL的online encoder需剥离head仅保留backboneclass BackboneOnly(nn.Module): def __init__(self, model): super().__init__() self.backbone model.online_encoder # 移除projection head def forward(self, x): return self.backbone(x) # 输出[batch, 2048]特征 traced_model torch.jit.trace(BackboneOnly(byol_model).eval().to(cpu), torch.randn(1, 3, 224, 224)) torch.jit.save(traced_model, backbone.pt)Core ML转换使用coremltools7.2支持MPS加速pip install coremltools7.2 python -c import coremltools as ct import torch # 加载trace模型 traced torch.jit.load(backbone.pt) # 转换为Core ML指定输入输出 mlmodel ct.convert( traced, inputs[ct.ImageType(nameinput, shape(1, 3, 224, 224))], outputs[ct.TensorType(nameoutput, shape(1, 2048))], compute_unitsct.ComputeUnit.ALL # 同时使用ANE和GPU ) mlmodel.save(byol_backbone.mlmodel) iPad端集成在Swift中调用// 加载模型 guard let model try? BYOLBackbone(configuration: MLModelConfiguration()) else { return } // 预处理使用VNCoreMLRequest自动处理 let request VNCoreMLRequest(model: model) { request, error in guard let results request.results as? [VNCoreMLFeatureValueObservation] else { return } let feature results[0].featureValue.multiArrayValue! // feature即2048维SSL特征可用于相似度搜索 }实测在iPad Pro M2上单帧224×224图像的SSL特征提取耗时仅42ms功耗0.8W支持30fps实时处理。这是x86方案无法企及的能效比。6.2 构建本地SSL训练服务FastAPI MPS的轻量级方案对于团队协作我搭建了一个基于FastAPI的本地SSL训练服务让非技术成员也能提交训练任务# app.py from fastapi import FastAPI, UploadFile, File from pydantic import BaseModel import torch import subprocess import uuid app FastAPI() class TrainRequest(BaseModel): model_type: str # simclr, byol, moco dataset_name: str epochs: int 10 app.post(/train) async def start_training(request: TrainRequest, dataset: UploadFile File(...)): # 保存上传数据集 dataset_path f/tmp/{uuid.uuid4()}.zip with open(dataset_path, wb) as f: f.write(await dataset.read()) # 启动后台训练进程隔离MPS环境 cmd [ python, train_ssl.py, --model, request.model_type, --data, dataset_path, --epochs, str(request.epochs), --device, mps ] proc subprocess.Popen(cmd, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT) return {job_id: proc.pid, status: started} # train_ssl.py中关键代码 if __name__ __main__: # 强制绑定到MPS设备 if torch.backends.mps.is_available(): device torch.device(mps) torch.mps.empty_cache() # 清理MPS缓存 # ... 训练逻辑该服务部署在Mac mini M2上通过uvicorn app:app --host 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2634200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…