作图纸 · 短片

0:00 / 1:1201机箱

八个小太阳

以 TikZ 代码作出一台 GPU 服务器,再让它满载发热

一台 GPU 服务器在图纸上逐笔成形,随后满载运转。片子先放结尾那一刻:八张卡满载,每个风扇上一个小太阳;然后倒回一张白纸。一颗橙色火花依照一段 TikZ 代码把服务器画出来:2U 机箱;八张卡,各有风扇、状态灯、散热鳍片与金手指;底部的 PCIe 总线,相邻两张卡之间各一座桥;每张卡一条穿出机箱的走线。凌晨三点,夜班派了几个推理小任务。随后每张卡都接到一个训练任务,一张接一张;温度朝 95 °C 爬升;每当一张卡的温度超过 88 °C,笔就在它的风扇上画一个小太阳。每一帧都在浏览器里依照这段代码实时绘制;配乐也由代码依据同一份作图计划生成。

Server Room 交互版
速度
96 BPM · 29 小节
画面
作图引擎 · WebGL
程序
一段 TikZ 代码,72 行
机柜
负载、功耗与发热均为模拟
声音
原创配乐,依据作图计划合成

章节7

TikZ 代码20 条语句

本片在 Server Room 的 TikZ 代码中补入了绘制八个太阳的语句,与「作图纸」的其他几支短片共用作图引擎;每张卡的温度超过 88 °C 时,对应的太阳开始绘制。复制的代码会附带一行 \tikzset,用于声明本图专用的键;粘贴到加载了 TikZ 宏包的 LaTeX 文档中即可编译。

% title: GPU 服务器,八张卡% prompt: 用 TikZ 画一台 GPU 服务器\begin{tikzpicture} % 2U 机箱及尺寸标注\draw[very thick] (-3.7,-2.1) rectangle (3.7,2.1);\draw[thick] (-3.7,1.82) -- (3.7,1.82);\foreach \x/\y in {-3.56/1.96,3.56/1.96,-3.56/-1.96,3.56/-1.96}  \draw (\x,\y) circle (.055);\draw[|<->|] (-3.7,2.5) -- node[above] {7.40} (3.7,2.5);\draw[|<->|] (-4.1,-2.1) -- node[left] {4.20} (-4.1,2.1); % 八张卡:风扇、轮毂、状态灯、十二片散热鳍片、金手指\foreach \i in {0,...,7} {  \draw[thick] (\i*.84-3.3,-1.35) rectangle ++(.72,3);  \draw (\i*.84-2.94,.85) circle (.27);  \draw (\i*.84-2.94,.85) circle (.06);  \fill[signal] (\i*.84-2.72,1.46) circle (.035);  \foreach \y in {.35,.23,...,-1}    \draw (\i*.84-3.22,\y) -- ++(.56,0);  \foreach \q in {0,...,7}    \draw (\i*.84-3.2+\q*.075,-1.35) -- ++(0,-.17);} % PCIe 总线;相邻两张卡之间各一座 NVLink 桥\draw[thick] (-3.65,-1.72) -- (3.65,-1.72);\foreach \i in {0,...,6} {  \draw (\i*.84-2.85,1.65) -- ++(0,.07) -- ++(.67,0) -- ++(0,-.07);  \draw (\i*.84-2.92,1.65) -- ++(0,.12) -- ++(.81,0) -- ++(0,-.12);} % 每张卡一条走线,45° 转角,穿出机箱\foreach \i in {0,...,7}  \draw[signal] ({\i*.84-2.94},-1.52) -- ({\i*.84-2.94},{-1.972+.036*\i})    -- ({\i*.84-2.87},{-2.042+.036*\i}) -- ({4.082-.036*\i},{-2.042+.036*\i})    -- ({4.152-.036*\i},{-1.972+.036*\i}) -- ({4.152-.036*\i},{-1.22+.13*\i});\foreach \i in {0,...,7}  \draw ({4.152-.036*\i},{-1.22+.13*\i}) circle (.03); % GPU 0 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(-2.94,.85)}] (\a:.31) -- (\a:.39); % GPU 1 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(-2.1,.85)}] (\a:.31) -- (\a:.39); % GPU 2 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(-1.26,.85)}] (\a:.31) -- (\a:.39); % GPU 3 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(-0.42,.85)}] (\a:.31) -- (\a:.39); % GPU 4 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(0.42,.85)}] (\a:.31) -- (\a:.39); % GPU 5 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(1.26,.85)}] (\a:.31) -- (\a:.39); % GPU 6 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(2.1,.85)}] (\a:.31) -- (\a:.39); % GPU 7 高温\foreach \a in {0,30,...,330}  \draw[signal,shift={(2.94,.85)}] (\a:.31) -- (\a:.39); \end{tikzpicture}

一台用 TikZ 写成的 GPU 服务器,播放时实时绘制并运转,无预录画面。

配乐:依据本片的作图计划与机柜的负载以代码合成,96 BPM。

作图引擎改编自 Giacomo Magnanini《I’m Upping My P(doom)》的第 1 幅图版 · mexicat/pdoom-video(MIT)。图中的服务器就是本站短片《小数点》开场画的那一台,是一台通用的八卡机箱,并非任何品牌的型号;负载、功耗与发热均为模拟,并非实录。

四宫格