📘 第14章 人工智能与海量数据和物联网
📄 一句话概括

物联网的数据不是攒出来的,是一秒一秒吐出来的。 全部传上云,带宽和延迟都付不起。 这一节算三件事:边缘算省多少毫秒、联邦学习省多少流量、数据不一样时平均会歪多少。

📝 本节和前面几节的关系

14.1 算的是存量数据的账,这一节算的是「正在产生的数据」。 两者加起来才是真实系统的数据成本。 8.4 讲过分布式人工智能的概念,这一节把它落到具体的三个数上:毫秒、GB、截距。

一、一条 200 字节能长多大

一千个传感器,每个每秒上报十次,每条 200 字节:

项目 数量
传感器个数 1000
每个每秒上报几次 10
每条多少字节 200
每秒总量 2.0 MB
一天 173 GB
一年 63.1 TB
一条 200 字节看着微不足道,乘上一千个、每秒十次、一年,就是几十 TB。
全部原样传到云上,光带宽和存储就是一笔持续支出。
注意这里的乘数是三个:数量、频率、时间。
任何一个看着不起眼的单条数据,被这三个乘数一放大,都能变成基础设施问题。

二、算在边缘,还是算在云上

一个「检测异常振动」的任务,两种放法的时间拆解:

环节 边缘 云
采集与采样 1 毫秒 1 毫秒
上传到云 0 毫秒 45 毫秒
推理计算 8 毫秒 3 毫秒
结果回传 0 毫秒 40 毫秒
本地动作 2 毫秒 2 毫秒
合计 11 毫秒 91 毫秒
差了 8 倍。注意云上那台机器算得更快(3 毫秒对 8 毫秒),
可它在路上花掉了 85 毫秒——算力再强也补不回来,这段距离是物理的。
对「发现就停机」这种任务,一秒的延迟可能就是一次事故。
所以边缘计算的第一动机从来不是省钱,是延迟。
第二笔账是流量。本地先做一遍粗筛,只把 1% 的可疑片段传上去:
做法 上传量
全天原样上传 0.2 TB
粗筛之后 1.7 GB
差 100 倍。省下来的不只是流量,还有云上的存储和计算。
这就是「在数据产生的地方先算一遍」的全部意思。

三、联邦学习:传模型不传数据

一个五百万参数的模型,单精度存下来 20 MB。 把「传数据」换成「传模型」,账就变了:

做法 一轮的数据量 一百轮
把原始数据传上去 0.2 TB 17 TB
一百个客户传模型 2.0 GB 200 GB
一百轮合计 200 GB,比传原始数据少两个数量级。
联邦学习的动机有一半是隐私,另一半就是这个通信量。
注意「只有一次」那一行的小字:原始数据只需传一次,可那一次之后就出门了。
联邦学习省的不只是流量,还有「数据不必离开本地」这条承诺。
代价是:模型要来回传一百轮,而且每一轮的合并都得有人管。
它把「一次性搬运」换成了「长期的小额通信」。

四、客户数据不一样,平均会歪

三个客户测的本来是同一件事,可传感器标定不一样,关系各自偏了一点。 斜率都接近 2,截距分别是 1.0、1.6、0.9:

客户 x 的范围 样本数 本地拟合 真实截距
甲 0 到 2 200 y = 1.988 x + 1.057 1.0
乙 4 到 6 200 y = 2.170 x + 0.769 1.6
丙 8 到 10 800 y = 1.987 x + 0.996 0.9
三种合并方式的差别,在截距上最明显:
合并方式 得到的直线
直接平均三个模型 y = 2.048 x + 0.941
按样本数加权平均 y = 2.018 x + 0.968
把所有数据合起来训 y = 1.958 x + 1.322
加权平均和集中训练差了 0.354——不相等。
原因在 x 区间:三家互不重叠,谁也没见过别人那段里的点。
参数一平均,等于把三段局部规律硬拼成一条线,每一段都不准。
直接平均更差,它连样本数都不看。
这就是「客户数据不同分布」在联邦学习里最典型的后果。

五、动手 Demo:数据在产生的地方就算掉

四段:一年的数据量、边缘与云的延迟拆解、联邦学习的通信量、 三个客户数据不同分布时平均会歪多少。 延迟那张表是拆出来的,不是量出来的——每个环节取的是公开的典型值。 但只要拆开看,钱花在哪一段就一目了然。

def edge():                        # 边缘:算完就地动作
    return 1 + 0 + 8 + 0 + 2       # 采集、上传、推理、回传、动作


def cloud():                       # 云上:同一件事绕一圈
    return 1 + 45 + 3 + 40 + 2


model_mb = 5e6 * 4 / 1e6           # 五百万参数,单精度
per_round = 100 * model_mb         # 一百个客户各传一份模型
print(u"一百轮 %.0f GB" % (per_round * 100 / 1000))

实跑输出:

--------------------------------------------------------------------
数据在产生的地方就算掉
--------------------------------------------------------------------
==============================================================

[1] 一千个传感器,一年能产生多少数据

    项目                  数量
    传感器个数            1000
    每个每秒上报几次      10
    每条多少字节          200
    每秒总量              2.0 MB
    一天                  173 GB
    一年                  63.1 TB

  **一条 200 字节看着微不足道,乘上一千个、每秒十次、一年,就是几十 TB。**
  **全部原样传到云上,光带宽和存储就是一笔持续支出。**

[2] 边缘算 vs 云上算:差的是延迟和流量

  一个「检测异常振动」的任务,两种放法的时间拆解:

    环节                  边缘        云
    采集与采样            1 毫秒      1 毫秒
    上传到云              0 毫秒      45 毫秒
    推理计算              8 毫秒      3 毫秒
    结果回传              0 毫秒      40 毫秒
    本地动作              2 毫秒      2 毫秒
    合计                  11 毫秒     91 毫秒

  **差了 8 倍。**
  **对「发现就停机」这种任务,一秒的延迟可能就是一次事故,**
  **算力再强也补不回来——这段距离是物理的。**

  再看流量:本地先做一遍粗筛,只把 1% 的可疑片段传上去。
    全天上传              0.2 TB
    粗筛之后              1.7 GB
  **差 100 倍,省下来的不只是流量,还有云的存储和计算。**

[3] 联邦学习:传模型,不传数据

  一个五百万参数的模型,单精度存下来 20 MB。

    做法                      一轮的数据量      一百轮        说明
    把原始数据传上去          0.2 TB            17 TB         只有一次,但数据出门了
    一百个客户传模型          2.0 GB            200 GB        数据不出门

  **一百轮合计 200 GB,比传原始数据少两个数量级。**
  **联邦学习的动机有一半是隐私,另一半就是这个通信量。**

[4] 客户的数据不一样,平均出来的模型会歪

  三个客户测的本来是同一件事,可传感器标定不一样,关系各自偏了一点。
  斜率都接近 2,截距分别是 +1.0、+1.6、+0.9:

    客户    x 的范围        样本数    本地拟合                  真实截距
    甲      0 到 2          200       y = 1.988 x + 1.057       1.0
    乙      4 到 6          200       y = 2.170 x + 0.769       1.6
    丙      8 到 10         800       y = 1.987 x + 0.996       0.9

    直接平均三个模型        y = 2.048 x + 0.941
    按样本数加权平均        y = 2.018 x + 0.968
    把所有数据合起来训      y = 1.958 x + 1.322

  **加权平均和集中训练差了 0.354——不相等。**
  **原因在 x 区间:三家互不重叠,谁也没见过别人那段里的点。**
  **参数一平均,等于把三段局部规律硬拼成一条线,每一段都不准。**
  **直接平均更差,它连样本数都不看。**
  **这就是「客户数据不同分布」在联邦学习里最典型的后果。**

  四段连起来:**单条数据很小,乘上时间和数量就是 TB**;
  **边缘算图的是延迟,粗筛图的是流量**;
  **联邦学习把「传数据」换成「传模型」,少两个数量级**;
  **而客户数据不一样时,平均之前先想清楚该按什么加权。**

第 1 段那三个乘数值得记住:个数、频率、时间。 任何一个变大,总量就跟着变大,而且是乘法关系。 第 2 段最重要的一行是「推理计算 8 毫秒对 3 毫秒」。 云上算得更快,可它输了 85 毫秒的路程——这就是边缘计算的立论基础。 第 3 段 200 GB 对 17 TB,差两个数量级。 注意这是「一百轮」的总和,如果客户更多、轮数更多,这个差距会缩小。 第 4 段那个 0.354 是这一节最该记住的数。 它说明「联邦平均」不是「集中训练的等价物」——只有在数据同分布时,两者才近似。

30 秒实验

  1. 把第 1 段的传感器从 1000 个改成 10000 个,重跑。 一年会变成六百多 TB——规模一变,边缘粗筛就从「优化」变成「必需」。
  2. 把第 2 段的上传延迟从 45 毫秒改成 5 毫秒(比如换 5G 专网),重跑。 云端总分掉到五十多毫秒, 差距从 8 倍缩到五倍左右——延迟的账要按链路拆,不能笼统说「云慢」。
  3. 把第 4 段乙客户的样本数改成 2000,重跑加权平均。 加权那行会明显往乙的截距靠—— 权重给谁,模型就往谁那边偏,这也是联邦学习里「谁的数据多谁说话响」的由来。

常见误区

  1. 以为「边缘计算是为了省钱」。第一动机是延迟。 省流量是附带的,而且很多时候边缘设备的维护成本更高。
  2. 以为「联邦学习不传数据所以没有通信成本」。传的是模型参数, 一百轮下来也有几百 GB,模型越大越贵。
  3. 以为「联邦平均等于集中训练」。Demo 第 4 段:截距差 0.354。 各家的数据不在同一个区间里,平均出来的线谁都不准。
  4. 以为「数据越多模型越准」。如果多出来的数据分布和原来不一样, 不校准反而会把模型带偏——这不是算法问题,是数据治理问题。
自测三问(点开对答案) 1. 边缘计算为什么能把延迟从 91 毫秒压到 11 毫秒? —— 因为**它省掉了两段路:上传 45 毫秒、回传 40 毫秒**。 **注意推理本身在边缘更慢(8 毫秒对 3 毫秒),可总账还是快 8 倍。** **这就是「距离比算力更贵」的意思。** 2. 联邦学习为什么能少两个数量级? —— 因为**传的是模型参数,不是原始数据**。 **Demo:一百个客户一百轮合计 200 GB,原始数据一次就是 17 TB。** **模型越小、轮数越少,这个优势越明显。** 3. 三个客户的数据不一样,为什么平均会歪? —— 因为**他们的 x 区间互不重叠**,各自的截距只在本地有效。 **参数一平均,等于把三段局部规律硬拼成一条线。** **Demo 里加权平均和集中训练差 0.354,就是这个原因。**

物联网让数据从「存着」变成「流着」。 下一节看两个更极端的数据源:一个是人脑的扫描,一个是机器人的传感器。 一个的数据量大在「体素乘时间乘人数」,一个的难点在「毫秒」。

相关笔记