
Leiolai 这个项目的思路很直接用户把自己设备上用不到的算力贡献出来交给 AI 任务使用平台按贡献情况给用户回报。也就是说设备不只是消费终端还可以成为 AI 计算网络里的一个计算节点。这个模式之所以在工程上成立背景是 AI 训练和推理对 GPU、CPU 的需求增长很快而大量个人电脑、工作站和高配游戏机在大多数时间处于闲置状态。这里不讨论投资判断也不替任何人做价值评估而是从技术视角拆解这类“算力换收益”平台的核心架构、设备接入方式、贡献计量原理、验证与防作弊设计、常见问题排查和参与边界。读完后你会得到一份用于评估算力共享项目的技术清单也能在自己的设备上安全跑通“注册设备、心跳、接单、上报、结算验证”这条链路。需要先说清楚Leiolai 的具体协议、版本号、计费和提现参数目前不能凭空确认下文凡是涉及具体数值的地方都按常见实现给示例实际落地前一定要结合官方客户端文档核对。1. 先理解“设备算力换 AI 收益”到底在解决什么问题1.1 AI 算力供需不平衡是这个模式的前提大模型从训练到推理每一步都在消耗大量计算资源。训练阶段通常依赖专业 GPU 集群而推理、评测、数据预处理、小规模微调片段这类任务对设备的要求虽然没那么高但数量大、频次高放在云上按小时计费并不便宜。另一方面普通用户的台式机、工作站、游戏主机往往有大核 CPU、中高端显卡和空闲内存一天 24 小时里真正被占满的时间可能只有几个小时。Leiolai 这类项目做的就是把这两端连起来任务方把可分割、可容错、对延迟不敏感的 AI 任务发布到平台用户设备装上 Agent 后成为计算节点平台负责调度、验证和结算。设备贡献的不是“全部算力”而是算力池里的一块碎片平台也不会把所有任务都派给同一台设备而是按能力标签、在线状态和历史质量分动态匹配。1.2 与自建服务器、云 GPU 实例的关键差异理解这个模式最有效的方式是把它和传统的自建集群、云 GPU 实例放在一张表里对比。对比维度自建 GPU 集群云 GPU 实例类似 Leiolai 的分布式算力平台使用门槛高需要采购、运维中开通即用低安装 Agent 即可成本结构固定成本高按小时付费按贡献分成网络与稳定性完全可控基本可控依赖用户设备在线状态任务隔离自己管理云平台管理需要沙箱和审计适合任务长期稳定训练任务弹性短任务可分割、容错高的推理和辅助任务收益不确定性无无有取决于任务量和质量分从这个表能看到分布式算力平台的核心优势是低门槛和碎片化供给代价则是稳定性、安全性和结果质量都需要额外机制兜底。个人设备随时可能离线任务可能被中断设备环境千差万别所以这类平台在设计上必须默认每个节点都是不可靠的。1.3 这类平台真正难的不是发钱而是证明贡献发钱在工程上只是一个账本问题记录谁贡献了多少按规则累计积分最后进入结算队列。真正困难的是回答三个问题这台设备是否真的执行了任务而不是伪造了结果执行结果是否可信有没有为了跑量而给低质量输出设备是否通过多开、改机、批量注册等方式刷取收益这三个问题都属于“可验证性”问题。平台需要在设备指纹、任务分发、结果校验、延迟结算之间做组合设计才能让收益体系不被刷穿。这一点会在第 4 节展开讲它也是评估一个算力共享项目是否靠谱的核心观察点。2. 架构从任务提交到收益入账的一条完整链路2.1 核心模块怎么划分一个典型的“设备算力换 AI 收益”平台从架构上可以分成四块控制平面负责设备注册、心跳管理、任务队列、调度器、验证服务和账本服务。它是平台的“大脑”不参与具体计算。设备端 Agent负责硬件探测、资源限制、任务执行、沙箱隔离、心跳上报和结果签名。它跑在用户设备上是平台与真实算力之间的桥梁。任务系统定义任务运行时环境、输入数据、输出格式、截止时间和期望回报。任务方通过它把工作发布到平台上。结算服务维护积分账本执行风控规则处理提现队列。它不在任务链路上但决定用户最终能不能拿到收益。理解这四块之后你会发现 Agent 只是最外层的一环。真正决定平台能否长期运转的是调度、验证和结算这背后的服务。2.2 一次 AI 推理任务从提交到落账的生命周期一次普通推理任务的完整链路大概是这样的任务方提交任务声明运行环境、输入数据、输出 schema、截止时间和积分数量。调度器根据设备的算力标签CPU 核心数、内存、GPU 型号、显存和在线状态做匹配。Agent 轮询任务接口拉到一个任务返回确认服务端记录该任务的租约。Agent 在沙箱中执行任务同时限制 CPU、内存、GPU 和带宽占用。执行完成后Agent 把结果上报到平台带上任务 ID、设备签名和时间戳。验证服务对结果做抽查或冗余比对判断结果是否可信。账本写入一条 pending 记录验证通过后置为 approved并累加到设备积分。积分达到提现门槛后进入结算队列按平台规则打款。这个链路里第 6 步和第 7 步是关键。如果跳过验证直接给积分等于把信用建立在对每个设备端的绝对信任上这是做不到的。2.3 为什么设备端大多采用“拉取”而不是“推送”家庭设备通常在 NAT 后面没有公网端口服务端无法主动连到设备上。要实现推送要么做反向连接要么维持长连接 WebSocket复杂度明显更高。拉取模型更简单Agent 定期轮询任务接口服务端只需要维护一个待执行队列。代价是任务分发会有轮询延迟但对推理、评测、数据预处理这类非实时任务来说十几秒甚至一分钟的延迟完全可以接受。这里体现了一个重要的工程判断架构选择要先服从设备网络环境的现实而不是优先追求理论上的实时性。3. 设备端接入环境准备和 Agent 运行3.1 设备要求和环境检查参与这类平台设备端通常会有一个 Agent 客户端。下面是常见的最小要求具体以官方文档为准操作系统Linux 最常见部分平台支持 Windows 和 macOS。容器环境Docker用于把任务隔离在沙箱里。GPU 驱动如果要跑 GPU 任务需要 NVIDIA 驱动和 nvidia-container-toolkit。Python 环境Agent 常见实现基于 Python 3.8。网络需要能稳定访问平台 API上传带宽不能太小。系统时间必须保持同步否则任务签名和租约容易失效。建议先做一次环境检查docker version --format {{.Server.Version}} nvidia-smi python3 --version timedatectl status在学习环境里一台虚拟机加 CPU 就能跑通 Agent 的核心链路真正参与 GPU 任务时才需要真实显存。落地前要确认平台要求的 Docker 版本和 GPU 驱动版本不要直接拿生产服务器做实验。3.2 Agent 的最小工作循环Agent 的职责可以抽象成一个循环心跳、取任务、执行、上报然后继续心跳。下面这个 Python 示例只用于说明思路实际实现要结合平台的 API 协议、鉴权方式和任务类型来写。import time import requests HEARTBEAT_API https://agent.example.com/api/v1/devices/me/heartbeat TAKE_API https://agent.example.com/api/v1/tasks/take REPORT_API https://agent.example.com/api/v1/tasks/report def send(path, payload, token, timeout15): resp requests.post( path, jsonpayload, headers{Authorization: fBearer {token}}, timeouttimeout, ) resp.raise_for_status() return resp.json() def heartbeat(device_id, token, statusidle): send(HEARTBEAT_API, {device_id: device_id, status: status}, token) def take_task(device_id, token): data send(TAKE_API, {device_id: device_id}, token) return data if data.get(task_id) else None def execute(task): # 真实实现要根据 task[type] 加载模型或脚本并在沙箱中运行 return {task_id: task[task_id], status: succeeded, output: sample} def main(device_id, token): while True: try: task take_task(device_id, token) if task is None: time.sleep(10) continue result execute(task) send(REPORT_API, result, token) except Exception as exc: print(agent error:, exc) time.sleep(30) finally: heartbeat(device_id, token) time.sleep(5) if __name__ __main__: device_id dev-7f3a90c2 token 由平台生成的设备访问凭证 main(device_id, token)这段代码的关键点有三个取任务时要带上设备 ID上报结果时原样带回调度的 task_id异常时不能直接退出而要进入退避重试。不要尝试自己伪造 task_id 或重复上报因为服务端会通过唯一约束和签名校验来拦截。3.3 配置文件常见参数Agent 通常会有一份配置文件用来控制资源占用和网络行为。一个典型的 YAML 配置片段如下device: id: dev-7f3a90c2 name: home-pc group: default agent: poll_interval_sec: 10 heartbeat_interval_sec: 60 task_timeout_sec: 600 sandbox: docker max_concurrent_tasks: 1 resource_limits: cpu_cores: 4 memory_mb: 8192 gpu: true gpu_vram_mb: 12288 max_upload_kbps: 2048配置参数的含义和调整影响可以参考下面这张表参数含义常见值调大/调小的影响poll_interval_sec拉取任务的间隔10 秒调小接单更及时但请求量增大heartbeat_interval_sec心跳间隔60 秒调太大会被判离线调太小浪费请求task_timeout_sec单任务超时600 秒太短会让长任务失败太长会长时间占用资源cpu_cores可使用的 CPU 核心数4设太低收益低设太高影响本机使用memory_mb可使用的内存上限8192设太低任务容易 OOM太高影响本机gpu_vram_mbGPU 显存上限12288控制多任务并发的显存分配max_upload_kbps上行带宽上限2048防止任务上报占满家用带宽配置文件最重要的是资源上限。它的目的不是让用户把机器榨干而是让任务和本机日常使用可以共存。不要为了多赚一点点积分把 CPU 和内存全部交出去否则本机体验会明显变差。3.4 心跳为什么重要又为什么不能只靠心跳心跳是设备在线状态的证明。Agent 每隔几十秒上报一次设备 ID 和状态服务端会记录最后心跳时间。调度器分配任务时首先过滤掉心跳超时的设备。心跳还经常携带当前的资源快照比如 CPU 使用率、空闲显存、网络状况帮助调度器判断当前能不能再接新任务。但心跳只能证明“设备还活着”不能证明“设备在认真干活”。所以平台还需要任务级确认、租约机制和结果验证。租约是指服务端在派发任务时会给一个有效时间窗口Agent 必须在这个窗口内完成并上报否则任务会被重新分配。这一层设计弥补了心跳的不足。4. 贡献度计量、验证与防作弊4.1 贡献度不是“开机时间”在 AI 产品语境里credits 通常是一种计费单位在算力共享平台里它同样是记账单位代表一次可验证的算力贡献。积分不应该按开机时长来计算否则挂机脚本只要保持在线就能刷收益。合理的计量方式是基础积分由任务类型和任务标定回报决定再结合实际执行时长、结果质量分和平台系数做修正。任务执行 5 分钟但结果不可信积分为零任务执行 5 分钟且结果通过验证积分正常入账。整个体系的前提是“先验证后积分”。4.2 常用的计量指标指标含义为什么重要单任务积分任务发布时标定的基础回报决定任务收益上限执行时长任务实际运行时间用于修正积分但需要防止人为拖慢结果质量分验证服务给出的 0 到 1 评分低分会扣减或拒绝积分设备基准分设备 benchmark 标定值用于调度匹配和积分系数在线稳定率过去 7 天心跳和任务完成率影响设备接单优先级指标不是越多越好。每增加一个指标平台的计算和风控复杂度都会上升。但完全没有质量评价体系的平台大概率会在短期被刷单冲垮。4.3 结果验证的三种常用手段第一种是确定性任务重复执行。对于相同输入应该产生相同输出的任务平台可以保存结果的哈希值后续设备上报时直接比对不一致就标记为失败。第二种是抽查和冗余执行对高价值任务或低分设备派多个节点交叉验证。第三种是基准任务标定定期下发放 benchmark 任务识别“设备上报规格与实际能力不符”的情况。下面是一个简单的抽查策略示例import random def should_verify(device_history_score, task_priority): # 低历史分设备和高优先级任务都提高抽查率 if device_history_score 0.7: return True if task_priority high: return True return random.random() 0.1抽查不能做满否则验证成本会吃掉平台收益也不能太低否则作弊会抬头。合理的做法是根据设备历史表现和任务价值动态调整概率。4.4 防作弊的基础设计设备指纹与账户绑定避免一台机器多开刷量。结果签名Agent 用设备私钥对结果签名服务端验签后才能入账。异常频率检测短时间内大量任务、固定时间点集中上报等模式会触发风控。延迟结算积分先进入 pending 状态达到门槛后按平台规则 TN 结算给验证和申诉留出时间。这里要强调一点这些机制的设计目标不是让用户去“绕过”而是让平台在一个充满不可信节点的环境里维持信用。如果读者在评估一个平台时发现它没有结果验证和延迟结算就应该保持警惕。4.5 收益账本的数据结构收益账本是整个系统的财务核心必须能追溯。一张简化后的积分账表如下CREATE TABLE reward_ledger ( id BIGINT PRIMARY KEY AUTO_INCREMENT, device_id VARCHAR(64) NOT NULL, task_id VARCHAR(64) NOT NULL, task_type VARCHAR(32) NOT NULL, claimed_points INT NOT NULL, rating DECIMAL(3,2) NOT NULL DEFAULT 1.00, status ENUM(pending,approved,rejected) NOT NULL DEFAULT pending, created_at DATETIME NOT NULL, settled_at DATETIME NULL, UNIQUE KEY uk_task (task_id), KEY idx_device_time (device_id, created_at) );task_id 上的唯一约束是关键它保证同一任务不会重复入账。status 从 pending 到 approved 再到 settled 的状态流转保证了每一笔收益都有清晰的审计轨迹。如果平台没有类似的账本结构用户很难对账出问题也不容易追溯。5. 运行验证从注册设备到看到第一笔积分5.1 验证清单接入完成后建议按下面这份清单逐项确认而不是只看 Agent 进程还在不在设备注册成功拿到 device_id 和 token。Agent 启动后心跳接口返回 200控制台显示设备 online。控制台能识别出正确的硬件信息包括 CPU 核心数、内存、GPU 型号和显存。有任务时日志出现 take 成功记录并包含任务 ID。任务执行完成后上报接口返回成功。账本里出现一条 pending 积分记录。一段时间后状态变为 approved积分累计到设备余额。达到起付门槛后结算记录出现。这份清单尤其适合在接入初期使用。第 6 步和第 7 步之间的时间差是正常的因为平台需要验证窗口但如果超过平台承诺的验证时间还没有变化就需要进入排查流程。5.2 正常和异常的日志现象正常情况下的日志大致是这样的[INFO] heartbeat accepted, next in 60s [INFO] task accepted: t-20240320-001, typeclip-embed [INFO] task t-20240320-001 completed in 12.3s [INFO] report accepted, reward pending: 15 credits异常情况下的日志则是另一种形态[WARN] heartbeat rejected: device offline for 180s [ERROR] task t-20240320-001 timeout after 600s [ERROR] report failed: signature mismatch每条日志都有含义。心跳被拒绝说明设备曾经离线超时或被风控标记任务超时说明执行时间超过了租约签名不匹配说明系统时间不同步或者 Agent 版本与服务端不兼容。建议把日志本地保留一份出现争议时可以作为排查依据。6. 常见问题排查6.1 设备在线但收益为 0这是最常见的现象。可能原因有很多设备硬件标签和当前任务不匹配导致调度器一直没派单Agent 取到了任务但执行失败没有完成上报验证被拒绝结果质量分过低积分还在 pending 状态设备被风控标记但没有提示。检查顺序应该是先在控制台确认设备状态和硬件识别结果再看本地任务日志然后到账本记录里查有没有 pending 或 rejected最后确认是否触发了风控提示。不要一上来就去怀疑平台大多数情况下问题出在设备端环境。6.2 任务失败率高任务失败率高的原因通常集中在三块依赖缺失、沙箱镜像拉取失败、资源上限设置过低。GPU 任务尤其常见驱动版本和 nvidia-container-toolkit 不匹配容器里根本看不到显卡。处理方式是先看失败错误码再用平台提供的基础镜像在本地手动跑一次最后逐步调大内存和超时参数。6.3 积分到账延迟或对不上积分 pending 时间过长可能是验证队列积压也可能是结果被标记为待复核。到账对不上最常见的原因是同一任务被重复执行或者任务方中途取消了任务。处理方法是导出账本明细做对账重点检查 task_id 是否重复、状态是 pending 还是 rejected。下面是一张排查速查表问题现象可能原因检查方式处理建议在线但收益为 0没有任务匹配或结果未通过验证查看控制台、任务日志、账本状态检查资源标签、更新 Agent、确认任务类型任务失败率高沙箱、依赖或网络超时查看失败错误码和日志补依赖、放宽超时、提高资源上限积分 pending 很久验证队列积压查任务验证时间戳等待验证窗口必要时提交工单Agent 频繁断连心跳间隔过大或网络抖动看心跳日志调小心跳间隔检查网络稳定性上报失败token 过期或签名问题查看 HTTP 状态码重新生成 token校准系统时间7. 参与这类平台要注意的安全与隐私边界7.1 先判断客户端是否可信参与算力共享本质上是把自己的设备开放给第三方运行任务。因此接入前的第一件事不是看收益而是检查 Agent 客户端是否可信。可以从几个角度判断客户端是否开源是否有版本签名Agent 是否是独立进程或容器是否只访问平台 API安装过程是否需要管理员权限资源占用是否和文档描述一致。如果条件允许可以在隔离环境里先运行 Agent观察进程行为、文件写入和网络连接。抓包观察请求目标是合规的网络调试行为目的是确认 Agent 没有在悄悄上传无关数据。7.2 运行任务相当于把设备借出去任务可能在用户设备上做推理、数据分析、文本处理等各种事情。平台和任务方通常会提供任务说明但用户无法逐条审计所有任务代码。所以参与时要守住一条底线不在参与设备上保留敏感文件不把生产服务器或存有客户资料的机器拿来做算力共享。7.3 平台侧应该做到的隔离一个负责任的平台在任务执行侧至少要做到使用 Docker 或虚拟机沙箱任务进程以非 root 用户运行不使用 privileged 权限对 CPU、内存、显存做限额限制不受信任任务访问网络并对任务镜像做签名校验。如果平台连基本的沙箱隔离都没有说明它没有把用户设备安全当一回事。7.4 设备信息会被采集要提前确认范围参与这类平台硬件信息、IP 地址、在线时长这些数据必然会上报。问题在于上报范围和使用目的。接入前应该读一遍该平台的隐私政策和用户协议确认采集字段最小化、不采集无关的个人资料。收益再高也不值得用隐私风险去换。8. 最佳实践和可复用的参与清单8.1 参与前的设备检查清单只用闲置设备不使用工作机或重要业务服务器。确认系统时间已开启自动同步。确认 Docker 可用GPU 驱动和容器运行时版本匹配。配置文件里设置好 CPU、内存、显存和带宽上限。token 只保存在本机配置文件中不要提交到代码仓库。先跑一周记录收益、失败率和电费再决定是否长期参与。8.2 给开发者的一条工程启示这类平台的工程范式和普通业务系统很不一样节点不可信、网络不可控、结算必须可追溯。它其实是一个很好的分布式系统练习素材。可以自己动手写一个最小任务分发服务依次加入设备注册、心跳、任务队列、结果上报和抽查验证。这些能力在自建内部任务平台、分布式 CI 构建、模型评测任务分发中都有复用价值。8.3 什么时候应该参与什么时候应该观望比较稳妥的判断标准是设备本来就有闲置算力顺带参与没有问题如果为了收益专门去买高配显卡就要先把电费、噪音、硬件损耗和平台回款周期算清楚。积分数字不等于实际收益延迟结算和验证规则会直接影响现金流。最稳的做法总是先用低配闲置设备跑通全流程理解计量规则之后再加大投入。