在 AI 算力成本居高不下的今天一个叫 Leiolai 的项目把“闲置设备算力”做成了可以变现的商品用户把手机、电脑、家用服务器空闲时的计算能力贡献给平台平台将这部分算力用于 AI 相关任务并向用户支付报酬。标题里的 Show HN 来自 Hacker News 的展示板块意味着项目还很早期公开可确认的实现细节不多。但它的方向值得认真讨论AI 正在消耗大量算力而大量终端设备的算力却在大多数时间里处于闲置状态。对于熟悉分布式计算的人来说这个模式并不算颠覆性创新。SETIhome、Foldinghome 很早就用分散设备做科学计算云计算出现后也有不少算力共享平台。Leiolai 这类“AI 算力共享 激励”项目真正特殊的地方是把经济激励直接嵌入到算力网络中。它要回答的不再是“任务能不能跑完”而是“怎么让设备拥有者心甘情愿贡献资源同时保证任务结果可信、收益结算公平、数据安全可控”。本文从技术视角拆解这个模式而不是替任何项目背书。我会分析这类系统由哪几部分组成从设备注册到收益结算的完整链路是什么并给出一套可在本地运行的最小原型代码。如果你想接入类似的算力共享平台或者自己做一个分布式 AI 算力系统读完这篇文章可以直接上手验证核心流程。1. 这类项目解决的核心问题算力供需错配1.1 AI 算力是 AI 应用的最大成本之一无论是训练大模型还是部署推理服务算力都是绕不开的核心成本。大模型的参数规模增长带来的是 GPU 显存、计算时长和电力消耗的同步上涨。对中小团队来说购买服务器或者按量租用云 GPU都是一笔不小的支出。更麻烦的是很多 AI 任务并不是持续满载运行的它可能只在某个时间段内产生大量计算需求其余时间资源闲置。传统方案是“按峰值采购”为了撑住业务高峰提前准备足够的计算资源。这个方案的缺点是明显的非高峰期的资源浪费会直接转化为成本压力。如果换成“按需弹性伸缩”又依赖云厂商的实例池而热门实例在高峰期经常缺货。1.2 大量终端设备在大多数时间是闲着的再看用户侧。个人电脑的 CPU 在很多场景下利用率并不高手机在处理完日常任务后也基本处于低负载状态游戏主机在家里可能一周只开一两次。这些设备的单体算力不算强但数量极其庞大。如果把几千个、几万个这样的设备连接起来累计算力可以达到一个相当可观的规模。Leiolai 的思路就是把这些零散算力接入一个统一平台让 AI 任务以分片形式下发到各台设备上执行设备拥有者按贡献量获得报酬。这个模型在概念上类似“算力版的共享经济”相当于把 Airbnb 的逻辑复制到计算资源领域你有闲置资源平台帮你找到愿意付费的使用者最后由平台完成撮合、计费和分成。1.3 为什么现在才出现这类项目分布式计算和网格计算都是很老的概念但今天再谈算力共享技术条件已经不一样了。首先是基础软件成熟了。容器、任务队列、分布式调度框架让“把一个任务拆成很多小任务再合并结果”变得标准化单个节点崩溃也不再是致命问题。其次是通信与加密技术足够可靠。设备可以通过加密通道上报心跳、接收任务、返回结果数据在传输过程中的安全性能得到保障。即便设备位于 NAT 后面也有成熟的穿透方案。第三是边缘设备性能变强了。普通手机的 CPU/GPU 已经能跑一些轻量化模型家用电脑更是可以承担中等规模的计算任务。配合模型量化、剪枝等技术很多 AI 推理任务已经不需要大型 GPU 也能完成。这些条件叠加起来让“AI 付费使用用户设备算力”从理想变成了一个可以上线的产品。Leiolai 并不是第一个做这件事的但它代表了这一波算力激励项目的典型形态。2. 系统架构与核心模块从工程角度看这类系统可以分成六个核心模块。理解这些模块就能理解整个系统的技术全貌。2.1 六个核心模块模块职责关键技术点资源层管理贡献节点收集设备状态心跳上报、资源探测、负载采集调度层把任务拆分并按策略分发给节点任务队列、负载均衡、故障转移计算层在贡献节点上实际执行任务容器/沙箱、GPU/CPU 调度验证层判断节点返回的结果是否可信哈希校验、交叉验证、抽样验证激励层记录贡献量并计算报酬计量、计费、防刷、结算管理层管理节点身份、信誉、权限节点注册、认证、黑名单这个分层方式并不是唯一答案但它能帮你快速定位一个算力共享平台的技术能力边界。大多数开源项目把注意力放在前四层商业平台则会重点打磨后两层因为激励层的公平性和管理层的安全性直接决定用户是否愿意长期参与。2.2 资源层设备怎么接入设备接入是整个流程的起点。贡献端需要安装一个客户端或 SDK完成三件事身份注册、资源上报、状态心跳。身份注册解决的是“你是谁”的问题。平台会给每台设备分配一个唯一标识可能是设备 ID也可能是密钥对。它既用于后续的持续通信也用于防止同一台设备刷多个身份来套取奖励。资源上报决定“你能干什么”。客户端需要把 CPU 核数、GPU 型号、可用内存、磁盘空间、网络带宽等信息上报给平台。平台根据这些信息决定能不能把某类任务分配给你。状态心跳解决“你现在能不能干活”。因为消费级设备随时可能关机、断网、被用户抢着使用平台不可能长期信任一个节点的在线状态只能通过短时间间隔的心跳来维护一份实时节点列表。心跳超时的节点会被标记为离线任务自动转移到其他节点。这里真正容易踩坑的地方是网络环境。家庭宽带大多没有公网 IP设备在 NAT 后面平台无法主动连接贡献节点。比较稳妥的做法是由贡献端主动建立与调度服务的长连接或者通过 WebSocket 保持通道避免经典的“服务端连不上客户端”问题。2.3 调度层任务怎么分配调度层的职责是把一个 AI 任务拆成多个可并行执行的小任务然后分发给合适的节点。最简单策略是轮询任务依次发给空闲节点。更合理的方式是加权分配CPU 核数多、在线稳定、历史完成率高的节点获得更多任务。如果某个节点失败次数过多调度器会降低它的优先级甚至把它移出候选池。调度层还需要处理任务超时。有些任务在本地执行可能只需要几秒但在低性能设备上可能要几分钟。平台不能无限等待通常会给每个任务设置超时时间超时后重新分配。为了保证结果不冲突一个分片一般只允许一个节点执行否则还会引入“重复计算到底以谁为准”的额外问题。2.4 验证层怎么防止节点造假算力共享系统最大的技术风险是节点偷懒或造假。节点可能直接返回一个随机结果来骗取报酬也可能因为本地环境问题产生错误结果。验证层要解决两类问题第一结果是否在计算过程中被篡改第二结果是否真的来自一次有效计算。对第一类问题常见做法是摘要校验。任务执行完成后节点对结果计算哈希并把结果和哈希一起返回。平台收到后重新计算哈希不匹配就判定失败。对第二类问题常见做法是抽样交叉验证。平台会在多个节点上重复执行同一个分片对比结果是否一致。对于确定性任务交叉验证非常有效对于有随机性的训练任务则需要设计更宽松的校验规则比如比较损失函数的数值范围是否合理。真实项目中验证策略往往是“成本与可信度的平衡”。每个任务都重复执行会浪费算力完全不验证又挡不住恶意节点。所以更常见的做法是按节点信誉分层新节点多校验老节点、高信誉节点减少校验频率。2.5 激励层钱怎么算清楚激励层是 Leiolai 这类项目区别于传统分布式计算的地方。它不是简单地“算完任务就结束”而是要把每一份算力贡献折算成可量化、可审计、可兑换的收益。计量的基础单位通常是“有效计算量”。从材料看不同平台有不同口径有的按时长算有的按 CPU/GPU 型号折算有的按完成的任务数量和难度给分。这里的关键问题是平台必须让用户清楚自己的收益是怎么算出来的否则用户很难建立信任。结算模块还要处理防刷问题。如果平台按任务数量给钱恶意用户就会想办法提交大量无意义任务来刷收益。平台需要结合节点历史表现、任务完成率和结果校验结果设计一套评分机制。用户信誉越高平台越愿意分配高价值任务信誉低收益权重就会下降。3. 从设备接入到收益结算的完整流程了解模块之后我们把完整链路串一遍。无论具体产品怎么实现核心环节通常都会包括以下七步。注册与设备接入。用户下载客户端或 SDK进行身份认证平台下发设备唯一标识和密钥。资源上报与心跳。客户端把设备配置、在线状态、空闲情况持续上报给平台等待任务分配。任务下发。平台根据任务类型、节点算力、信誉评分选择合适的节点下达一个可执行的计算分片。本地执行。节点在沙箱或容器中运行任务计算完成后把结果文件或结果摘要返回平台。结果校验。平台验证结果完整性和正确性校验通过后确认本次任务有效。贡献计量与记账。平台把本次任务折算成算力贡献量写入用户账户流水。结算与提现。用户达到最低结算门槛后可以将账户中的积分或收益提现到自己的账户。这七步里最容易出问题的是第 5 步和第 6 步。结果校验不严系统会被恶意节点薅羊毛计量口径不透明用户会因为收益低于预期而流失。可以说算力共享平台的长期竞争力取决于这两步的工程实现质量。4. 最小动手实验本地模拟贡献端与调度端下面我们用 Python 写一个最小原型演示贡献端注册、心跳、调度分配和结果校验。它的目的不是再现一个完整的商业平台而是帮助你理解核心流程。以下代码均为概念演示不代表 Leiolai 官方 SDK具体接入时请以目标平台的 API 文档为准。4.1 环境准备本文实验环境如下操作系统不限Windows / macOS / Linux 均可Python3.8 及以上依赖库Flask、requests安装依赖pip install flask requests不需要 GPU理解代码逻辑即可。4.2 调度服务端注册与心跳接口我们先用 Flask 写一个最简服务端维护节点列表并接收贡献端的注册和心跳请求。# demo_server.py from flask import Flask, request, jsonify app Flask(__name__) nodes {} app.route(/api/register, methods[POST]) def register(): data request.get_json(forceTrue) device_id data.get(device_id) if not device_id: return jsonify({ok: False, error: device_id is required}), 400 nodes[device_id] data return jsonify({ok: True, device_id: device_id}) app.route(/api/heartbeat, methods[POST]) def heartbeat(): data request.get_json(forceTrue) device_id data.get(device_id) if device_id not in nodes: return jsonify({ok: False, error: node not registered}), 404 nodes[device_id][status] data.get(task_status, idle) nodes[device_id][ts] data.get(ts) return jsonify({ok: True, ts: data.get(ts)}) if __name__ __main__: app.run(host0.0.0.0, port8000)启动方式python demo_server.py这个服务端维护了一个全局字典nodes注册接口把设备信息写入字典心跳接口更新设备状态。在真实系统中这部分数据会存到 Redis 或数据库里并增加过期清理机制。4.3 贡献节点端注册与心跳贡献端模拟一台设备启动时注册设备信息然后定期发送心跳表示自己处于空闲状态。# demo_worker.py import time import requests BASE_URL http://localhost:8000 def register(device_id, spec): resp requests.post(f{BASE_URL}/api/register, json{ device_id: device_id, spec: spec, status: idle }, timeout5) print(register:, resp.json()) def heartbeat(device_id, task_status): resp requests.post(f{BASE_URL}/api/heartbeat, json{ device_id: device_id, task_status: task_status, ts: int(time.time()) }, timeout5) print(heartbeat:, resp.json()) if __name__ __main__: node_id node-demo-001 register(node_id, {cpu_cores: 4, gpu: none, memory_gb: 16}) for _ in range(3): heartbeat(node_id, idle) time.sleep(2)先启动demo_server.py再运行demo_worker.py。正常情况下worker 会先打印注册成功信息然后每两秒打印一次心跳成功信息。这段代码模拟了贡献端与平台之间的基础通信。真实环境里注册时还会带上公钥心跳中会增加实时负载、CPU 温度、网络延迟等指标但核心交互逻辑是一致的。4.4 调度端任务分配逻辑调度端的核心职责是“把任务分配给适配的节点”。下面这段代码演示最简分配策略遍历任务队列把任务交给第一个空闲节点。# demo_scheduler.py import time class Task: def __init__(self, task_id, payload, required_cores1, reward10): self.task_id task_id self.payload payload self.required_cores required_cores self.reward reward def dispatch_tasks(tasks, nodes): assigned [] while tasks: task tasks.pop(0) target None for node in nodes: if node[status] idle: target node break if target is None: tasks.insert(0, task) break target[status] busy assigned.append((task.task_id, target[device_id], task.reward)) target[status] idle time.sleep(0.1) return assigned if __name__ __main__: nodes [ {device_id: node-a, status: idle}, {device_id: node-b, status: idle}, ] tasks [ Task(t1, 训练数据分片, reward20), Task(t2, 推理请求, reward5), Task(t3, 数据清洗, reward8), ] for item in dispatch_tasks(tasks, nodes): print(assigned:, item)运行结果示例assigned: (t1, node-a, 20) assigned: (t2, node-b, 5) assigned: (t3, node-a, 8)这个策略非常朴素没有考虑节点算力差异和任务优先级。真实调度器会引入权重比如 CPU 核数多的节点获得更高权重任务在队列中按优先级排序。但核心逻辑仍然是“选择合适节点 - 下发任务 - 记录分配结果”。4.5 结果校验与记账最后是验证层和激励层的简化演示。我们用 SHA-256 摘要来校验结果是否完整校验通过后给账户增加余额。# demo_validator.py import hashlib def checksum(text): return hashlib.sha256(text.encode(utf-8)).hexdigest() def verify_and_pay(result, expected_reward, balance): if result[checksum] checksum(result[data]): balance expected_reward return True, balance return False, balance if __name__ __main__: result { data: demo-result: model inference output, checksum: checksum(demo-result: model inference output), } balance 0 ok, balance verify_and_pay(result, 20, balance) print(verified:, ok, balance:, balance)运行结果verified: True balance: 20如果把result[checksum]改成错误值校验就会失败账户余额也不会增加。这对应了平台拒绝虚假结果的场景。从这四个最小代码块可以看出一个算力共享系统的最小闭环并不复杂节点接入、心跳维护、任务分配、结果验证、收益记账。难点在于把每个环节放到大规模、高并发、可信度要求高的生产环境里并保证收益公平和系统安全。4.6 如何验证整个链路本地实验建议按以下顺序验证启动demo_server.py在浏览器访问http://localhost:8000确认服务已经启动。运行demo_worker.py观察服务端是否打印注册和心跳请求日志。运行demo_scheduler.py确认任务被正确分配给空闲节点。运行demo_validator.py确认校验通过后余额增加。如果发现 worker 连接不上服务端优先检查端口是否被占用、防火墙是否拦截了本机 8000 端口。如果调度器没有分配任务检查节点状态是否都是idle。5. 关键风险与非技术问题技术架构只是这类项目的一面另一面是运营、安全与合规问题。如果只看技术很容易低估实际风险。5.1 算力收益可能远低于预期用户最容易产生的误区是“设备一开就能赚钱”。实际上平台是否有足够多的任务下发直接决定了收益。如果任务量不足设备即使 24 小时在线也只是空等。另一个影响收益的因素是节点类型高端 GPU 和高性能 CPU 的节点会优先接到高价值任务普通低配设备可能长时间分不到任务。参与这类项目之前应该先算一笔账设备功耗、电费、网络带宽消耗、硬件损耗以及占用的时间成本。只有当平台给出的预期收益能够覆盖这些成本时闲置算力变现才是一个划算的选择。5.2 恶意节点与数据安全问题开放算力网络天然面临恶意节点风险。恶意节点可能返回伪造结果或者尝试下载任务包后窃取其中的数据。如果平台把包含敏感数据的任务下发到不可信节点就可能造成数据泄露。从工程上看平台需要对任务包做脱敏处理尽量只下发不敏感的数据分片。对于模型推理任务要考虑模型权重被窃取的风险必要时采用安全沙箱和加密内存。从用户角度看不要轻易运行来源不明的任务包也不要在一个节点上同时存放重要个人数据与算力客户端。5.3 结算与依赖风险算力共享平台的收益结算依赖平台自身规则如果平台关闭、调整规则或出现资金问题用户累计的收益可能无法兑现。这不是技术缺陷而是商业模式的固有风险。选择平台时要重点看结算规则是否清晰、是否存在最低提现门槛、历史兑现记录是否正常。另外算力共享项目的用户分布在全球各地涉及不同地区的支付和税务政策。用户获得收益是否需要申报、平台是否有代扣义务都取决于具体地区的规则。这里不做法律建议但参与前应该了解当地相关政策。6. 常见问题与排查思路问题现象可能原因排查方式解决方案设备接入后一直看不到收益节点没有被分配任务查看心跳上报状态与调度日志确认设备满足任务要求保持设备在线尝试选择更适合的任务类型任务频繁失败节点网络不稳定或依赖缺失查看执行日志、检查 Python 环境和任务依赖增加重试次数缩短任务分片固定运行环境算力收益明显低于预期平台任务量不足或设备优先级低对比同一时段不同节点的任务分配量提高设备在线时长提升节点信誉选择高价值任务怀疑结果被平台少算计量口径不透明对比本地任务日志与平台结算记录保留本地任务日志选择计量透明的平台客户端导致设备卡顿资源占用过高查看客户端 CPU/内存占用设置资源使用阈值在空闲时段运行节点离线后任务丢失心跳超时查看服务端离线节点列表与重试机制任务重新分配节点恢复后重新注册这些问题的共同点是都要先分清楚是“平台侧问题”还是“设备侧问题”。平台侧问题只能换平台或者等待平台修复设备侧问题则可以通过调整配置和网络环境来解决。7. 最佳实践与工程建议如果你是要参与算力共享的用户下面的建议能让你的设备更稳定、收益更可控如果你是要开发类似平台的工程师这些建议同样可以作为架构设计参考。7.1 节点端做好资源隔离与负载保护贡献设备不能因为运行算力任务而影响用户正常使用。最佳实践是将任务放到容器或虚拟机中运行限制 CPU、内存和网络带宽的上限。客户端应该支持“空闲时才工作”模式比如检测到键盘输入、鼠标移动或前台应用切换时主动暂停任务。还要监控设备温度和功耗。长期满负载运行对散热不佳的设备是很大考验建议开启温度阈值保护超过安全温度时暂停计算任务。7.2 调度端任务设计要幂等且可重试分布式环境下节点可能在任何阶段崩溃。任务必须支持幂等同一个任务分片被重复执行不会导致结果翻倍或数据冲突。调度端要为每个任务生成全局唯一 ID并记录任务的重试次数避免无限重试占用队列。任务粒度也要控制好。分片太大会导致单节点计算时间过长失败成本高分片太小会增加调度开销和网络传输成本。合理的做法是先做压测找到性能和稳定性的平衡点。7.3 激励层计量必须有审计日志激励层的核心是信任而信任来自可审计的记录。平台应该为每一笔收益生成完整流水任务 ID、设备 ID、计算时长、结果摘要、校验状态、奖励金额。用户端也要在本地保存任务执行记录方便对账。防刷机制不能只看单个任务要综合节点历史数据。比如一个节点长期只接简单任务、从不失败、完成速度异常快就需要触发人工审查或提高验证比例。7.4 安全最小权限与数据脱敏无论是平台还是贡献节点都要遵守最小权限原则。任务容器不应该有访问宿主文件系统的权限不应该有外发任意网络请求的权限。平台下发的数据要尽量脱敏把敏感字段在本地做替换只下发计算所需的最少信息。如果涉及模型推理模型权重是核心资产。平台要防止节点通过多次推理请求反推出模型参数必要时限制单节点的请求次数或者对输出结果做扰动。7.5 生产环境先小规模试点不要一开始就把生产任务交给一个不熟悉的算力共享平台。建议先投放小批量、非关键、可容忍失败的任务观察平台的调度质量、结算能力和节点稳定性。验证周期至少覆盖一周以上因为算力平台的真实表现往往在周末、节假日和夜间时段才会完全体现出来。8. 总结与后续学习方向Leiolai 这类项目把“闲置资源”与“AI 需求”串联起来在概念上很有吸引力。但从工程角度看真正决定这类系统价值的不是“能不能收集算力”而是能不能把任务调度、结果验证、收益结算和信任机制这四件小事做到极致。任何一个环节偷懒用户都会用脚投票。如果你想继续深入这个方向建议从三个技术点入手。第一是分布式任务调度研究 Ray、Celery、Kubernetes Job 的设计思路理解大规模任务分发和故障转移的实现方式。第二是结果验证机制学习安全多方计算、可信执行环境和区块链预言机中的验证思想思考如何在不信任节点之间建立可验证的计算流程。第三是激励模型设计关注量化积分、信誉评分和防刷策略这些往往决定了一个算力共享产品能不能活过早期阶段。如果你准备参与这类平台我的建议是先跑通一个最小实验观察自己设备的功耗、网络带宽和收益曲线再决定是否长期投入。毕竟算力共享听起来是把设备变成资产但落到实际项目里还是得先算清楚成本账。