1. 流体压强
压强是什么
在流体力学里, "压强"既可以从力学定义理解, 也可以从应力张量分解理解;
静止流体(无剪切应力): 压强等于任意方向切面上的法向应力(方向无关);
一般流动(存在剪切应力): 同一点上不同方向的法向应力可能不同, 此时压强被定义为应力张量的各向同性(平均法向)部分;
压强的力学定义
在一点处取一个小平面(面积趋近于 0), 流体对该平面的作用力可以分解为法向与切向:
法向力密度(法向应力):
p≡limA→0FnAp \equiv \lim_{A\to 0}\frac{F_n}{A}p≡limA→0AFn
这里强调"法向", 因为压强是各向同性的法向作用强度(在静止/无黏等条件下成立);
为什么静止流体中压强与方向无关(Pascal 定律)
物理直觉
静止流体内部没有持续的剪切滑移: 如果同一点在不同方向切面上的法向应力不相等, 会导致微小流体体元产生净力矩或剪切趋势, 从而发生运动, 与"静止"矛盾;
更严格的表述(应力张量观点)
静止流体中剪切应力为 0, 因此应力张量只能是各向同性形式:
σ ...
0. 搜索引擎基础概念
搜索引擎的组件
HTML 解析器 (HTML Parser)
功能: 从 HTML 文件中提取内容, 将其转化为一系列标记(Tokens), 并区分这些词是出现在标题(Title)还是正文(Body)中;
提取链接: 它还负责提取指向其他文档的链接以及对应的锚文本(Anchor text);
挑战: 来源指出, 由于互联网上存在大量格式错误, 破损的 HTML 代码, 编写一个不崩溃且健壮的解析器往往是项目中最耗时且最具挑战性的部分;
爬虫 (Crawler)
link 管理: 管理一个待爬取的"前沿(Frontier)"链接池, 决定爬取的先后顺序, 并记录已爬取的页面以防重复;
多线程协作: 为了不被慢速网站拖累, 爬虫必须是高度多线程的;
合规性: 爬虫必须遵守 robots.txt 协议, 并应在 User-Agent 字段中留下联系方式, 以示"礼貌"并防止被视为拒绝服务(DOS)攻击;
索引 (Index)
核心产物: 这是一个合并的倒排词索引(Inverted word index), 记录了每个单词出现的所有文档及其具体 ...
0. 基本 GPU 架构
Data-Level Parallelism (DLP)
在前面的工作中我们主要学习的 并行架构 就是 pipelining
简单的做法就是并行使用多个 核 core 或者使用多个硬件结构实现并行, 但是这里要讨论的是 数据层面的并行
在固有的处理器中, 我们计算如下公式
12for(i = 0; i < 100; i++) z[i] = A * x[i] + y[i];
很显然这一步可以用矩阵和向量等式进行优化
即表达式 z⃗=A⋅x⃗+y⃗\vec z = A\cdot \vec x + \vec yz=A⋅x+y
那么接下来的问题就是如何用硬件快速计算向量
SIMD 方法论
基础方法称为 single insturction single data 处理, 即每个指令获取一个对应的 data 部分, 但是事实上我们可以从一个指令调用多个 变量(来自一个 vector 的多个相关变量) 这就是 simd (可以在单核处理器上面有出色表现)
当然也可以 多个指令调用多个变量, 这个取决于多核同时工作
对比 cpu 和 gpu, 我们会发现当我们要处理大量相同类型的数据的时候 ...
0. Introduction to Fluid Dynamics
membrane 的含义
在流体/界面现象里常用 “membrane” 类比液面: 并非真的有固体膜, 而是说界面在力学上像"被拉紧的薄膜";
膜模型强调: 界面存在面内张力, 会倾向于缩小表面积;
表面张力 σ\sigmaσ 的本质
表面张力不是压强, 也不是黏性力;
物理量与单位
σ\sigmaσ: N/m(等价于 J/m2^22), 是"单位长度的拉力"或"单位面积的表面能";
压强 ppp: Pa = N/m2^22;
力 FFF: N;
两个等价定义
线力定义: F=σLF=\sigma LF=σL(界面上边界线长度为 LLL 的"拉力");
能量定义: dE=σ dAdE=\sigma\, dAdE=σdA(增加界面面积需要做功);
σ\sigmaσ 与什么有关
强相关: 两相组合(液-气/液-液/液-固), 温度(通常升温 σ\sigmaσ 降), 表面活性剂/污染物, 溶质浓度, 界面吸附;
与黏度 μ\muμ 没有直接换算关系; 但在动态毛细流里 σ\sigmaσ 作为 ...
1. transformer
0. 最小心智模型: Attention = 两次矩阵乘
打分(谁看谁)
S=QKTS = QK^TS=QKT
加权求和(读出内容)
O=softmax(S) VO = \text{softmax}(S)\,VO=softmax(S)V
1. Anchor 1: Q / K / V 的形状(只记这一组)
对 单个 batch, 单个 head:
Q∈RN×dQ \in \mathbb{R}^{N \times d}Q∈RN×d
K∈RN×dK \in \mathbb{R}^{N \times d}K∈RN×d
V∈RN×dV \in \mathbb{R}^{N \times d}V∈RN×d
含义:
NNN: 序列长度(token 数)
ddd: 每个 head 的维度(head_dim)
口诀: Q/K/V 都是"每个 token 一行, 每行一个 d 维向量";
2. Anchor 2: 为什么注意力矩阵是 N×NN \times NN×N
KT∈Rd×NK^T \in \mathbb{R}^{d \times N}KT∈Rd×N
S= ...
10. Tradeoffs btw
平衡的背景
利用冗余(replicas)来降低尾延迟(tail latency), 以及它和 Paxos 共识, load / sharding 之间的关系;
核心是: 复制本来是为了容错/可用性, 但你也可以把它当成"多条独立路径/多台机器"的并行机会, 用来对抗偶发慢请求;
一个 key 有多个副本(N replicas);
- 正常读: 只读一个副本
- 好处: 负载低, 便宜
- 风险: 这一次刚好遇到这个副本慢(GC, 排队, 抖动), 尾延迟就被拖垮
First idea: read from all in parallel(最直接: 全部并行读, 取最快)
做法: 同时向所有副本发 GET, 拿到第一个返回就用(其他请求丢掉/忽略);
优点: 尾延迟会显著下降(你拿的是 min(response times))
问题(slide 点出的): 系统负载和成本暴涨
每次读都变成 N 倍 RPC
平均延迟可能更好, 但整体排队更严重, 反而把系统推到更拥塞, 导致更差的 tail
所以"全并行"通常太贵, 只能在极少数场景用;
Sec ...
8. Sharding, Facebook and Implementation
分片 (Sharding)
分片是分布式系统设计中的一个关键概念, 它与复制(Replication)一起, 构成了构建大规模系统的基础;
分片的本质与目标
分片的本质在于解决单一机器的限制和不可靠性问题,;
复制(Replication): 通过复制数据来使机器可靠(reliable), 提高容错性;
分片(Sharding): 通过分割数据来提高机器的容量限制 (raise the machine’s limits);
分片适用于任何存储系统, 通常是通过将 键空间(key space) 分割到多个复制对(例如主/备份对)来实现;
Facebook 架构中的分片应用
复制存储: 数据库在所有数据中心之间进行复制(replicated), 可以想象每个数据中心都包含一份完整的数据拷贝,;
数据库分割: 数据库被分割成多个分片(shards), 每个数据元素都属于一个特定的分片,;
- 领导者/跟随者: 每个分片都有一个数据中心作为其领导者(leader), 其余的中心是跟随者(followers);
- 数量: 分片的数量通常远多于(many more)数 ...
7. Eventual Consistency
简单介绍
最终一致性位于一致性谱系的末端, 比线性一致性(Linearizability), 顺序一致性和因果一致性都要弱;
如果对某一数据项不再有新的更新写入, 那么在经过一段时间后, 所有未来的读取操作都将反映最新的写入结果
没有时间限制: 系统对收敛到一致状态所需的时间没有界限,;这个时间长短取决于通信模式的可用性(例如, 如果节点长期不通信, 收敛时间就会很长);
保证最终顺序: EC 仍然要求更新最终以相同的顺序应用到所有副本上,;这通常是通过逻辑时钟等机制来实现的, 允许更新先作为临时更新本地应用, 然后在同步时根据逻辑时间戳进行回滚和重放,;
Bayou 模型 (SOSP 1995)
没有中心化存储: 所有的节点都被视为客户端,;
始终接受更新: 客户端总是接受用户发出的更新操作, 这保证了高可用性和活性;
日志记录: 所有更新都会被记录在本地日志中;
点对点同步: 客户端之间会定期进行 成对(pair-wise) 的更新交换;
临时更新: 更新通常是暂时的(tentative), 可以解决它们之间的冲突;
举例说明最终一致性
假设有一个房间日程安排应用程序(Ro ...
6. 从 FLP 不可能到 CAP 和 PACELC
分布式系统的不稳定性
综合我们前几个章节的内容, 我们可以总结出分布式系统中的不稳定性主要源于以下几个方面:
故障模型 (Failure Model)
在这个模型中, 对节点和网络特性的定义如下:
节点(Nodes):
它们可以无限期地失败;
它们在恢复时不会丢失持久状态;
对任何特定的计算, 它们都没有时间限制;
网络(Network):
网络可以丢弃 drop 或延迟 latency 消息;
消息可能被无限期地延迟;
网络也可能对消息进行重新排序;
异步模型 (Asynchronous Model)
上述的故障模型被称为异步模型; 在该模型下, 核心挑战在于:
无法区分 Failure 与 Slow: 在一个异步模型中, 你通常无法区分失败(例如, 请求被丢弃或远程节点死亡)和极度缓慢(例如, 网络或节点速度很慢, 响应只是尚未到达);
No response 的含义: 缺少响应可能意味着请求被丢弃, 远程节点已死, 或响应被丢弃;但这也可能仅仅意味着网络或节点非常慢, 并且响应仍在路上;
也就是这些都 Not Distinguishable (无法区分);
F ...
9. 分布式事务系统与 Spanner
分布式事务系统 Distributed Transaction
根据分布式数据库系统的类似要求, 我们设计的分布式系统要支持 ACID 准则:
Atomicity (原子性): 事务要么全部完成, 要么全部不做;
Consistency (一致性): 事务执行前后, 数据库必须处于一致状态;
Isolation (隔离性): 并发执行的事务彼此隔离, 互不干扰;
Durability (持久性): 一旦事务提交, 其结果是永久性的, 即使系统崩溃也不会丢失;
如何区分 Linearizability 和 Serializability?
Linearizability (线性一致性):
每个操作看起来像是瞬间发生的, 并且所有的 read 都会反映已经发生的所有 write 的结果
Serializability (可串行化):
并发执行的事务的结果与某个串行执行的顺序相同
Strict Serializability:
结合了线性一致性和可串行化的概念
也就是外界看到的顺序和实际执行的顺序是一致的
Isolation 问题与二相锁 (2PL)
一个常见的 i ...
