Transformer 估算 101

@(Engineering Practice)

本文主要介紹用于估算 transformer 類模型計算量需求和內(nèi)存需求的相關(guān)數(shù)學方法。

引言

其實喘沿,很多有關(guān) transformer 語言模型的一些基本且重要的信息都可以用很簡單的方法估算出來较解。不幸的是艺挪,這些公式在 NLP 社區(qū)中鮮為人知被丧。本文的目的是總結(jié)這些公式儿礼,闡明它們是如何推導(dǎo)出來的及其作用乍钻。

注意: 本文主要關(guān)注訓練成本肛循,該成本主要由 GPU 的 VRAM 主導(dǎo)。如果你想知道有關(guān)推理成本(通常由推理延遲主導(dǎo))的信息银择,可以讀讀 Kipply 寫的這篇精彩博文多糠。

算力要求

下式可用于估算訓練一個 transformer 模型所需的算力成本:

C \approx \tau T = 6PD

這里:

  • C 是訓練 transformer 模型所需的計算量,單位為總浮點運算數(shù)(FLOP)
  • C=C_{\text {前向}}+C_{\text {后向}}
  • C_{\text {前向}} \approx 2PD
  • C_{\text {后向}} \approx 4PD
  • \tau 是訓練集群的實際總吞吐量:\tau=\text {GPU 數(shù)} \times \text {每 GPU 的實際每秒浮點運算數(shù)(實際 FLOPs)}欢摄,單位為 FLOPs
  • T 是訓練模型所花費的時間熬丧,以秒為單位
  • P 是 transformer 模型的參數(shù)量
  • D 是數(shù)據(jù)集大小,表示為數(shù)據(jù)集的總詞元數(shù)

該式由 OpenAI 的縮放定律論文DeepMind 的縮放定律論文 提出并經(jīng)其實驗驗證怀挠。想要獲取更多信息析蝴,可參閱這兩篇論文。

下面绿淋,我們討論一下 C 的單位闷畸。 C 是總計算量的度量,我們可以用許多單位來度量它吞滞,例如:

  • FLOP - 秒佑菩,單位為 {\text {每秒浮點運算數(shù)}} \times \text {秒}
  • GPU - 時盾沫,單位為 \text {GPU 數(shù)}\times\text {小時}
  • 縮放定律論文傾向于以 PetaFLOP - 天 為單位,即單位為 10^{15} \times 24 \times 3600

這里需要注意 \text {實際 FLOPs} 的概念殿漠。雖然 GPU 的規(guī)格書上通常只宣傳其理論 FLOPs赴精,但在實踐中我們從未達到過這些理論值(尤其在分布式訓練時!)绞幌。我們將在計算成本這一小節(jié)列出分布式訓練中常見的 \text {實際 FLOPs} 值蕾哟。

請注意,上面的算力成本公式來自于 這篇關(guān)于 LLM 訓練成本的精彩博文莲蜘。

參數(shù)量與數(shù)據(jù)集的權(quán)衡

嚴格來講谭确,你可以隨心所欲地使用任意數(shù)量的詞元來訓練 transformer 模型,但由于參與訓練的詞元數(shù)會極大地影響計算成本和最終模型的性能票渠,因此需要小心權(quán)衡逐哈。

我們從最關(guān)鍵的部分開始談起:“計算最優(yōu)” 語言模型。 “Chinchilla 縮放定律”问顷,得名于提出 “計算最優(yōu)” 語言模型論文中所訓練的模型名昂秃,指出計算最優(yōu)語言模型的 參數(shù)量數(shù)據(jù)集大小 的近似關(guān)系滿足:D=20P。該關(guān)系成立基于一個前提條件:使用 1,000 個 GPU 1 小時和使用 1 個 GPU 1,000 小時成本相同择诈。如果你的情況滿足該條件械蹋,你應(yīng)該使用上述公式去訓練一個性能最優(yōu)且 GPU - 時 成本最小的模型。

我們不建議在少于 200B 詞元的數(shù)據(jù)集上訓練 LLM羞芍。 雖然對于許多模型尺寸來說這是 “Chinchilla 最優(yōu)” 的哗戈,但生成的模型通常比較差。對于幾乎所有應(yīng)用而言荷科,我們建議確定你可接受的推理成本唯咬,并訓練一個滿足該推理成本要求的最大模型。

計算成本的經(jīng)驗值

Transformer 模型的計算成本通常以 GPU - 時FLOP - 秒 為單位畏浆。

  • GPT-NeoX 的 實際 TFLOP/s 在正常注意力機制下達到 150 TFLOP/s/A100胆胰,在 Flash 注意力機制下達到 180 FLOP/s/A100。這與其他高度優(yōu)化的大規(guī)模計算庫一致刻获,例如 Megatron-DS 的值是在 137 和 163 TFLOP/s/A100 之間蜀涨。
  • 一個通用的經(jīng)驗法則是 實際 TFLOP/s 可至 120 TFLOP/s/A100 左右。如果你得到低于 115 TFLOP/s/A100 的值蝎毡,可能是你的模型或硬件配置有問題厚柳。
  • 借助 InfiniBand 等高速互連設(shè)備,你可以在數(shù)據(jù)并行維度上實現(xiàn)線性或亞線性擴展(即增加數(shù)據(jù)并行度應(yīng)該以近乎線性的方式增加整體吞吐量)沐兵。下圖顯示了在橡樹嶺國家實驗室(Oak Ridge National Lab)的 Summit 超級計算機上測試出的 GPT-NeoX 庫的擴展性别垮。請注意,這張圖用的是 V100扎谎,而本文中的其他大多數(shù)例子都是基于 A100 的碳想。

內(nèi)存需求


Transformer 模型通常由其 參數(shù)尺寸 來描述烧董。但是,根據(jù)給定一組計算資源確定要訓練哪些模型時胧奔,你需要知道 該模型將占用多少空間(以字節(jié)為單位)逊移。這不僅需要考慮你的本地 GPU 可以推理多大的模型,還需要考慮給定訓練集群中的總可用 GPU 內(nèi)存可供訓練多大的模型葡盗。

推理

模型權(quán)重

模型權(quán)重

大多數(shù) transformer 模型都使用混合精度進行訓練螟左,可以是 fp16 + fp32 或是 bf16 + fp32∶俟唬混合精度降低了模型訓練和推理所需的內(nèi)存量。推理時巷嚣,我們還可以將語言模型從 fp32 轉(zhuǎn)換為 fp16 甚至 int8喘先,而沒有實質(zhì)性的精度損失。下面我們看看在不同的數(shù)據(jù)類型下廷粒,模型所需內(nèi)存有什么不同(以字節(jié)為單位):

  • 對 int8 而言窘拯,\text {模型內(nèi)存}=1 \text { 字節(jié)} /\text {參數(shù)}\cdot \text {參數(shù)量}
  • 對 fp16 和 bf16 而言,\text {模型內(nèi)存}=2 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}
  • 對 fp32 而言坝茎,\text {模型內(nèi)存}=4 \text { 字節(jié)} /\text {參數(shù)}\cdot \text {參數(shù)量}

推理總內(nèi)存

除了存儲模型權(quán)重所需的內(nèi)存外涤姊,實際中前向傳播過程中還會有少量額外開銷。根據(jù)我們的經(jīng)驗嗤放,此開銷在 20% 以內(nèi)思喊,該比例通常與模型無關(guān)。

總的來說次酌,回答 “這個模型是否適合推理” 這一問題恨课,可以用下述公式來獲得不錯的估計:

\text {推理總內(nèi)存} \approx 1.2 \times \text {模型內(nèi)存}

本文不會深究該開銷的來源,留待后面的文章來闡述岳服。在本文的后續(xù)部分剂公,我們將主要關(guān)注模型訓練的內(nèi)存。如果你有興趣了解更多有關(guān)推理計算需求的信息吊宋,請查看這篇深入介紹推理的精彩博文「倭桑現(xiàn)在,我們要開始訓練了璃搜!

訓練

除了模型權(quán)重之外拖吼,訓練還需要在設(shè)備內(nèi)存中存儲優(yōu)化器狀態(tài)和梯度。這就是為什么當你問 “我需要多少內(nèi)存來運行模型腺劣?”绿贞,別人會立即回答 “這取決于是訓練還是推理”。訓練總是比推理需要更多的內(nèi)存橘原,通常多得多籍铁!

模型權(quán)重

首先涡上,可以使用純 fp32 或純 fp16 訓練模型:

  • 純 fp32,\text {模型內(nèi)存}=4 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}
  • 純 fp16拒名,\text {模型內(nèi)存}=2 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}

除了推理中討論的常見模型權(quán)重數(shù)據(jù)類型外吩愧,訓練還引入了混合精度 訓練,例如 AMP增显。該技術(shù)尋求在保持收斂性的同時最大化 GPU 張量核的吞吐量⊙慵眩現(xiàn)代 DL 訓練領(lǐng)域經(jīng)常使用混合精度訓練,因為:1) fp32 訓練穩(wěn)定同云,但內(nèi)存開銷高且不能利用到 NVIDIA GPU 張量核糖权、2) fp16 訓練穩(wěn)定但難以收斂。更多混合精度訓練相關(guān)的內(nèi)容炸站,我們建議閱讀 tunib-ai 的 notebook星澳。請注意,混合精度要求模型的 fp16/bf16 和 fp32 版本都存儲在內(nèi)存中旱易,而模型需要的內(nèi)存如下:

  • 混合精度 (fp16/bf16 + fp32), \text {模型內(nèi)存}=2 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}

正如上面所講禁偎,這個僅僅是模型內(nèi)存,還需要額外加上 4 \text { 字節(jié) / 參數(shù)} \cdot \text {參數(shù)量}用于優(yōu)化器狀態(tài)計算 的模型副本阀坏,我們會在下面的 優(yōu)化器狀態(tài) 一節(jié)中算進去如暖。

優(yōu)化器狀態(tài)

Adam 有奇效,但內(nèi)存效率非常低忌堂。除了要求你有模型權(quán)重和梯度外盒至,你還需要額外保留三個梯度參數(shù)。因此浸船,

  • 對于純 AdamW妄迁,\text {優(yōu)化器內(nèi)存}=12 \text { 字節(jié)}/\text {參數(shù)}\cdot \text {參數(shù)量}
    • fp32 主權(quán)重:4 字節(jié) / 參數(shù)
    • 動量(momentum):4 字節(jié) / 參數(shù)
    • 方差(variance):4 字節(jié) / 參數(shù)
  • 對于像 bitsandbytes 這樣的 8 位優(yōu)化器,\text {優(yōu)化器內(nèi)存} =6 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}
    • fp32 主權(quán)重:4 字節(jié) / 參數(shù)
    • 動量:1 字節(jié) / 參數(shù)
    • 方差:1 字節(jié) / 參數(shù)
  • 對于含動量的類 SGD 優(yōu)化器李命,\text {優(yōu)化器內(nèi)存} =8 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}
    • fp32 主權(quán)重:4 字節(jié) / 參數(shù)
    • 動量:4 字節(jié) / 參數(shù)

梯度

梯度可以存儲為 fp32 或 fp16(請注意登淘,梯度數(shù)據(jù)類型通常與模型數(shù)據(jù)類型匹配。因此封字,我們可以看到在 fp16 混合精度訓練中黔州,梯度數(shù)據(jù)類型為 fp16),因此它們對內(nèi)存開銷的貢獻為:

  • 對于 fp32阔籽,\text {梯度內(nèi)存} = 4 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}
  • 對于 fp16流妻,\text {梯度內(nèi)存} = 2 \text { 字節(jié)} /\text {參數(shù)} \cdot \text {參數(shù)量}

激活和 Batch Size

對于 LLM 訓練而言,現(xiàn)代 GPU 通常受限于內(nèi)存瓶頸笆制,而不是算力绅这。因此,激活重計算(activation recomputation在辆,或稱為激活檢查點(activation checkpointing))就成為一種非常流行的以計算換內(nèi)存的方法证薇。激活重計算 / 檢查點主要的做法是重新計算某些層的激活而不把它們存在 GPU 內(nèi)存中度苔,從而減少內(nèi)存的使用量。內(nèi)存的減少量取決于我們選擇清除哪些層的激活浑度。舉個例子寇窑,Megatron 的選擇性重計算方案的效果如下圖所示:

圖中,紅色虛線表示 A100-80GB GPU 的內(nèi)存容量箩张,"present work" 表示使用選擇性激活重計算后的內(nèi)存需求甩骏。請參閱 Reducing Activation Recomputation in Large Transformer Models 一文,了解更多詳細信息以及下述公式的推導(dǎo)過程先慷。

下面給出存儲 transformer 模型激活所需內(nèi)存的基本公式:

\begin {align*}\text {無重計算的激活內(nèi)存}=sbhL (10+\frac {24}{t}+5\frac {a \cdot s}{h\cdot t}) \text { 字節(jié)}\end {align*}

\begin {align*}\text {選擇性重計算的激活內(nèi)存}=sbhL (10+\frac {24}{t}) \text { 字節(jié)}\end {align*}

\begin {align*}\text {全部重計算的激活內(nèi)存}=2 \cdot sbhL \text { 字節(jié)}\end {align*}

其中:

  • s 是序列長度饮笛,即序列中詞元的個數(shù)
  • b 是每個 GPU 的 batch size
  • h 是每個 transformer 層的隱含維度
  • L 是 transformer 模型的層數(shù)
  • a 是 transformer 模型中注意力頭(attention heads)的個數(shù)
  • t 是張量并行度(如果無張量并行,則為 1)
  • 我們假設(shè)沒有使用序列并行
  • 我們假設(shè)激活數(shù)據(jù)類型為 fp16

由于重計算的引入也會引起計算成本的增加论熙,具體增加多少取決于選擇了多少層進行重計算缎浇,但其上界為所有層都額外多了一次前向傳播,因此赴肚,更新后的前向傳播計算成本如下:

2PD\leq C_{\text {forward}}\leq4PD

訓練總內(nèi)存

至此,我們得到了回答 “這個模型是否適合訓練” 這一問題的一個很好的估算公式:

\begin {align*}\text {訓練總內(nèi)存} = \text {模型內(nèi)存}+ \text {優(yōu)化器內(nèi)存}+ \text {激活內(nèi)存}+ \text {梯度內(nèi)存}\end {align*}

分布式訓練

分片優(yōu)化器(sharded optimizer)

巨大的優(yōu)化器內(nèi)存開銷促使大家設(shè)計和實現(xiàn)了分片優(yōu)化器二蓝,目前常用的分片優(yōu)化器實現(xiàn)有 ZeROFSDP誉券。該分片策略可以使單 GPU 的優(yōu)化器內(nèi)存開銷隨 \text {GPU 個數(shù)} 線性下降,這就是為什么你會發(fā)現(xiàn)某個模型及其訓練配置可能在大規(guī)模集群上能跑刊愚,但到小規(guī)模集群時就 OOM(Out Of Memory踊跟,內(nèi)存耗盡)了。下圖來自于 ZeRO 論文鸥诽,它形象地說明了不同的 ZeRO 階段及它們之間的區(qū)別(注意 P_{os}商玫、P_{os+g }P_{os+g+p} 通常分別表示為 ZeRO-1、ZeRO-2牡借、ZeRO-3拳昌。ZeRO-0 通常表示 “禁用 ZeRO”):


下面,我們總結(jié)一下 ZeRO 各階段的內(nèi)存開銷公式(假定我們使用混合精度及 Adam 優(yōu)化器):

  • 對于 ZeRO-1钠龙,

\begin {align*}\text {訓練總內(nèi)存} \approx \text {模型內(nèi)存}+\frac {\text {優(yōu)化器內(nèi)存}}{\text {GPU 數(shù)}}+\text {激活內(nèi)存}+\text {梯度內(nèi)存}\end {align*}

  • 對于 ZeRO-2炬藤,

\begin {align*}\text {訓練總內(nèi)存} \approx\text {模型內(nèi)存}+\text {激活內(nèi)存}+\frac {\text {優(yōu)化器內(nèi)存}+\text {梯度內(nèi)存}}{\text {GPU 數(shù)}}\end {align*}

  • 對于 ZeRO-3,

\begin {align*}\text {訓練總內(nèi)存} \approx \text {激活內(nèi)存}+\frac {\text {模型內(nèi)存}+\text {優(yōu)化器內(nèi)存}+\text {梯度內(nèi)存}}{\text {GPU 數(shù)}} + \text {(ZeRO-3 實時參數(shù)量)}\end {align*}

其中碴里,在訓練過程沒有使用流水線并行或張量并行的條件下沈矿,\text {GPU 數(shù)} 即為 \text {DP 并行度}。更多詳細信息咬腋,請參閱 Sharded Optimizers + 3D Parallelism 一文羹膳。

請注意,ZeRO-3 引入了一組實時參數(shù)根竿。這是因為 ZeRO-3 引入了一組配置項(stage3_max_live_parameters, stage3_max_reuse_distance, stage3_prefetch_bucket_size, stage3_param_persistence_threshold)來控制同一時刻 GPU 內(nèi)存中可以放多少參數(shù)(較大的值占內(nèi)存更多但需要的通信更少)陵像。這些參數(shù)會對總的 GPU 內(nèi)存使用量產(chǎn)生重大影響就珠。

請注意,ZeRO 還可以通過 ZeRO-R 在數(shù)據(jù)并行 rank 間劃分激活蠢壹,這樣 \text {激活內(nèi)存} 還可以再除以張量并行度 t嗓违。更詳細的信息,請參閱相關(guān)的 ZeRO 論文 及其 配置選項(注意图贸,在 GPT-NeoX 中蹂季,相應(yīng)的配置標志為 partition_activations)。如果你正在訓練一個大模型疏日,激活放不下內(nèi)存而成為一個瓶頸偿洁,你可以使用這個方法用通信換內(nèi)存。把 ZeRO-R 與 ZeRO-1 結(jié)合使用時沟优,內(nèi)存消耗如下:

\begin {align*}\text {訓練總內(nèi)存}\approx\text {模型內(nèi)存}+\frac {\text {優(yōu)化器內(nèi)存}}{\text {GPU 數(shù)}}+\frac {\text {激活內(nèi)存}}{\text {張量并行度}}+\text {梯度內(nèi)存}\end {align*}

3D 并行

LLM 主要有 3 種并行方式:

數(shù)據(jù)并行: 在多個模型副本間拆分數(shù)據(jù)

流水線或張量 / 模型并行: 在各 GPU 之間拆分模型參數(shù)涕滋,因此需要大量的通信開銷。它們的內(nèi)存開銷大約是:

\begin {align*}\text {并行后模型內(nèi)存}\approx\frac {\text {模型內(nèi)存}}{\text {流水線并行度}\times\text {張量并行度}}\end {align*}

\begin {align*}\text {并行后梯度內(nèi)存}\approx\frac {\text {梯度內(nèi)存}}{\text {流水線并行度}}\end {align*}

請注意挠阁,這是個近似公式宾肺,因為 (1) 流水線并行對降低激活的內(nèi)存需求沒有幫助、(2) 流水線并行要求所有 GPU 存儲所有正在進行的 micro batch 的激活侵俗,這對大模型很重要锨用、(3) GPU 需要臨時存儲并行方案所需的額外通信緩沖區(qū)。

分片優(yōu)化器 + 3D 并行

當 ZeRO 與張量并行隘谣、流水線并行結(jié)合時增拥,由此產(chǎn)生的 GPU 間的并行策略如下:

3D 并行

值得一提的是,數(shù)據(jù)并行度對于計算訓練的全局 batch size 至關(guān)重要寻歧。數(shù)據(jù)并行度取決于你想在訓練集群中保持幾份完整模型副本:

\begin {align*}\text {數(shù)據(jù)并行度 = }\frac {\text {GPU 數(shù)}}{\text {流水線并行度}\times\text {張量并行度}}\end {align*}

雖然流水線并行和張量并行與所有 ZeRO 階段都兼容(例如掌栅,張量并行疊加上 ZeRO-3 后,我們會首先對張量進行切片码泛,然后在每個張量并行單元中應(yīng)用 ZeRO-3)猾封,但只有 ZeRO-1 與張量和 / 或流水線并行相結(jié)合時會效果才會好。這是由于梯度劃分在不同并行策略間會有沖突(如流水線并行和 ZeRO-2 都會對梯度進行劃分)弟晚,這會顯著增加通信開銷忘衍。

把所有東西打包到一起,我們可以得到一個典型的 3D 并行 + ZeRO-1 + 激活分區(qū) 方案:

\begin {align*}\text {訓練總內(nèi)存} \approx\frac {\text {模型內(nèi)存}}{\text {流水線并行度}\times\text {張量并行度}}+\frac {\text {優(yōu)化器內(nèi)存}}{\text {GPU 數(shù)}}+\frac {\text {激活內(nèi)存}}{\text {張量并行度}}+\frac {\text {梯度內(nèi)存}}{\text {流水線并行度}}\end {align*}

總結(jié)

EleutherAI 的工程師經(jīng)常使用上述估算方法來高效規(guī)劃卿城、調(diào)試分布式模型訓練枚钓。我們希望澄清這些經(jīng)常被忽視的但很有用的實現(xiàn)細節(jié),如果你想與我們討論或認為我們錯過了一些好的方法瑟押,歡迎你通過 contact@eleuther.ai 聯(lián)系我們搀捷!

請使用如下格式引用本文:

@misc {transformer-math-eleutherai,
  title = {Transformer Math 101},
  author = {Anthony, Quentin and Biderman, Stella and Schoelkopf, Hailey},
  howpublished = \url {blog.eleuther.ai/},
  year = {2023}
}

英文原文: <url> https://blog.eleuther.ai/transformer-math/ </url>
原文作者:Quentin Anthony,Stella Biderman,Hailey Schoelkopf嫩舟,作者們均來自EleutherAI
譯者: Matrix Yao (姚偉峰)氢烘,英特爾深度學習工程師,工作方向為 transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓練推理家厌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末播玖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饭于,更是在濱河造成了極大的恐慌蜀踏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掰吕,死亡現(xiàn)場離奇詭異果覆,居然都是意外死亡,警方通過查閱死者的電腦和手機殖熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門局待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菱属,你說我怎么就攤上這事钳榨。” “怎么了纽门?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵重绷,是天一觀的道長。 經(jīng)常有香客問我膜毁,道長,這世上最難降的妖魔是什么愤钾? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任瘟滨,我火速辦了婚禮,結(jié)果婚禮上能颁,老公的妹妹穿的比我還像新娘杂瘸。我一直安慰自己,他們只是感情好伙菊,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布败玉。 她就那樣靜靜地躺著,像睡著了一般镜硕。 火紅的嫁衣襯著肌膚如雪运翼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天兴枯,我揣著相機與錄音血淌,去河邊找鬼。 笑死,一個胖子當著我的面吹牛悠夯,可吹牛的內(nèi)容都是我干的癌淮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沦补,長吁一口氣:“原來是場噩夢啊……” “哼乳蓄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夕膀,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虚倒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后店诗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裹刮,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年庞瘸,在試婚紗的時候發(fā)現(xiàn)自己被綠了捧弃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡擦囊,死狀恐怖违霞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞬场,我是刑警寧澤买鸽,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贯被,受9級特大地震影響眼五,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彤灶,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一看幼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幌陕,春花似錦诵姜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至心例,卻和暖如春宵凌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背止后。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工摆寄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓微饥,卻偏偏與公主長得像逗扒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欠橘,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容