terms
===
###### tags: `LLM / terms`
###### tags: `ML`, `NLP`, `NLU`, `LLM`, `terms`, `ChatGPT`, `kv cache`, `kv-cache`
<br>
[TOC]
<br>
## datasets
- ### 評估語言模型性能的標準基準數據集或任務
- **RAFT (Repository of Artificially Faulty English Texts)**:
- RAFT 是一個通用的語言理解基準,包含人工引入錯誤的英文文本庫
- 用於評估語言理解模型的性能,特別是在理解具有錯誤的文本時的表現。
- **IMDB (Internet Movie Database)**:
- IMDB 是一個線上電影評論數據集,通常指的是從 IMDB 網站收集的電影評論數據。
- 通常用於情感分析任務,其中文本被標記為正面或負面情感。
- **Natural Questions**:
- Natural Questions 是由 Google 提供的一個問答數據集
- 包含自然語言問題和相關的答案,用於評估語言模型在回答自然語言問題時的性能。
- **QuAC (Question Answering in Context)**:
- QuAC是一個對話式問答數據集
- 用於評估語言模型在虛擬對話中回答問題的能力。
- **XSUM (Cross-document Summarization)**:
- XSUM是一個跨文件文本摘要數據集
- 用於評估語言模型的文本摘要能力,即根據輸入文本生成簡潔的摘要。
<br>
## Transformer
- ### 小結
- **Transformer 的注意力機制**:根據每個詞和其他詞之間的關聯性,計算注意力權重
- 注意力機制 = 捕捉一個詞上下文的一種方法
- **查詢(Query)**:
- 當前處理的詞向量
- i.e. 目前處理的詞的向量,用於計算注意力機制中與其他詞的關聯性。
- **鍵(Key)**:
- 相對於 query 的其他詞向量
- i.e. 詞的向量,用於計算注意力機制中詞彼此的相似度,影響上下文生成。
- **注意力分數**:
- 計算關聯性f(Query, Key) = 注意力權重
- i.e. 詞之間的相似度度量,決定哪些詞在注意力機制中受到關注。
- **值(Value)**:
- 整個句子的詞向量陣列
- i.e. 訊息或特徵的向量,用於注意力機制中,根據權重生成上下文表示。
- **注意力權重對值向量進行加權平均**:highlight(注意力分數, Value) = 加權過後的注意力分數
- **MP(Multi-Head Attention Pooling 多頭注意力池化)**
- 將多個注意力頭的輸出整合(池化)成一個表示
- i.e. 多個注意力頭的融合,用於提取多方面資訊的池化技術。
- **TP(Top-k Pooling, 前 k 個池化)**
- 根據某個準則(如注意力權重、分數等)選擇最高分數的前 k 個元素作為池化的結果。
- i.e. 從數據中選擇前k個最大值,忽略其他,用於縮小數據或選擇重要資訊。
- **flash attention**:
- 對處理長序列的計算量和記憶體消耗問題,提出新策略
- i.e. 用於長序列的稀疏注意力機制,減少計算量,提高效率,仍保持模型性能
- **batch size**:
- 每次訓練更新時用來處理的樣本數量,影響訓練速度和內存使用。
- **warmup model**
- 模型在訓練初期,使用較低的學習率可以穩定和提高訓練效果。
- ### 能簡單說明 Transformer 模型的注意力機制是怎麼回事?
[ChatGPT]
當然可以!Transformer 模型的注意力機制是一種能夠**讓模型在處理序列數據時,關注不同位置的信息的方法**。它是 Transformer 成功的關鍵之一。
假設我們有一個句子:「我喜歡這部電影,它非常有趣。」這句話中有幾個詞,而注意力機制能夠讓模型知道,當處理「有趣」這個詞時,它應該關注到前面提到的「電影」,因為這兩者有關聯。
在 Transformer 的注意力機制中,有三個重要的部分:**查詢(Query)、鍵(Key)和值(Value)**。**當模型處理一個特定詞的時候,這個詞的嵌入被稱為查詢,同一個句子中其他詞的嵌入被稱為鍵和值**。
模型通過計算查詢和鍵之間的相似度來獲取注意力分數,這些分數決定了不同位置的詞對於目前詞的重要性。然後,根據注意力分數,將值進行加權平均,生成最終的上下文表示。
簡而言之,Transformer 的注意力機制允許模型在處理每個詞時,根據其和其他詞之間的關聯性,賦予不同詞不同的注意力權重,從而生成更好的上下文表示。這使得模型能夠更好地理解序列數據中的依賴關係,從而在機器翻譯、文本生成等任務上表現出色。
- ### 上述 鍵和值 差在哪裡?
[ChatGPT]
在 Transformer 的注意力機制中,「鍵」(Key)和「值」(Value)是兩個不同的概念,它們在計算注意力分數和生成上下文表示時有不同的角色。
- **鍵(Key)**:
**鍵是用來表示序列中每個詞的重要性和特徵的向量。** 每個詞都會有一個相應的鍵向量,++**這個向量用來和查詢(Query)進行相似度計算,從而決定詞之間的關聯性**++。鍵向量的作用是提供了一種度量,用來衡量不同詞對於其他詞的影響。
- **值(Value)**:
**值是與每個詞相關的信息或特徵的向量。** 每個詞都有一個相應的值向量,**這個向量中存儲了與該詞相關的上下文信息**。在計算注意力分數後,根據注意力權重對值向量進行加權平均,從而生成最終的上下文表示。值向量的作用是提供了實際的信息內容,這些信息將被加權組合以生成上下文。
簡而言之,「鍵」是用來計算詞之間的相似度,以及它們對於其他詞的影響,而「值」則包含了實際的信息,這些信息在計算注意力分數後被組合起來,生成最終的上下文表示。這兩者在 Transformer 的注意力機制中共同作用,讓模型能夠有效地理解序列數據的相關性和依賴關係。
- ### 上述「值」則包含了實際的信息,是在說明什麼?
[ChatGPT]
對於 Transformer 中的注意力機制來說,「值」(Value)代表著與每個詞相關的實際信息或特徵。每個詞都有一個相對應的值向量,這個向量中包含了該詞的上下文信息,它是根據原始輸入序列經過嵌入轉換後得到的。這些值向量是模型從原始輸入數據中獲得的表徵,它們在生成最終的上下文表示時起到重要作用。
當計算注意力機制中的注意力分數時,鍵(Key)和查詢(Query)之間的相似度決定了詞之間的關聯性。而注意力分數被用來對值進行加權,這種加權平均的過程使得模型能夠集中關注與目標詞相關的信息。因此,每個詞的值向量中存儲的實際信息會受到注意力權重的影響,以形成最終的上下文表示。
以機器翻譯為例,當模型處理源語言句子時,每個詞的值向量包含了與該詞相關的原始語句信息。注意力機制通過計算詞之間的關聯性,然後將這些關聯性應用於值向量,以生成目標語言句子的上下文表示,從而進行翻譯。
總之,「值」向量代表著原始輸入序列中每個詞的實際信息或特徵,並且在注意力機制中起到了集中關注並生成上下文表示的作用。這種方式讓模型能夠更好地理解序列數據的含義和關聯。
- ### 上述「值」包含了該詞的上下文訊息,能舉實際例子?
[ChatGPT]
當我們談到「值」包含了詞的上下文訊息時,我們可以通過一個簡單的例子來理解。
考慮一個機器翻譯的情景,我們想要將英文句子「I like this movie, it's very interesting.」翻譯成法文。我們的模型正在處理英文句子,並且注意力機制將幫助我們捕捉到句子中的上下文訊息。
假設模型正在處理「interesting」這個詞。這個詞的「查詢」向量表示它自己,而與之對應的「鍵」向量和「值」向量則分別對應著整個句子中的每個詞。
在進行注意力計算時,模型會比較「查詢」向量和每個「鍵」向量之間的相似性,從而獲得注意力分數。這些分數告訴模型詞彼此之間的關聯性。而在計算注意力分數之後,模型將使用這些注意力分數來對「值」向量進行加權平均,從而生成「interesting」這個詞的上下文表示。
在這個例子中,「值」向量包含了整個句子中每個詞的信息,即「I like this movie, it's very interesting.」。因此,通過計算注意力權重,模型將更關注句子中與「interesting」有關聯的詞,並生成能夠捕捉其上下文的表示。這使得模型能夠理解「interesting」是與「movie」相關的,從而在翻譯成法文時,產生更準確的結果。
總之,「值」向量在注意力機制中存儲了詞的上下文訊息,通過計算注意力分數,模型可以集中關注詞之間的關聯性,生成能夠捕捉上下文的表示。這樣有助於提高模型在處理序列數據時的能力。
- ### transformer 的 MP 和 TP 是什麼意思?
[ChatGPT]
在 Transformer 模型中,"MP" 和 "TP" 分別指的是 "Multi-Head Attention Pooling"(多頭注意力池化)和 "Top-k Pooling"(前 k 個池化)。這些技術都涉及到在 Transformer 模型中處理注意力機制和池化過程,用於生成模型的輸出。
- **Multi-Head Attention Pooling (MP):**
在 Transformer 模型中,注意力機制是一個關鍵的組成部分,它讓模型能夠在處理序列數據時關注不同位置的信息。"Multi-Head Attention" 是一種技術,它通過同時計算多個不同的注意力機制(多個頭)來提取更多的信息。"Multi-Head Attention Pooling" 是在這基礎上進一步將多個注意力頭的輸出整合(池化)成一個表示,以供後續的處理和預測使用。
- **Top-k Pooling (TP):**
"Top-k Pooling" 是一種池化技術,它基於某個準則(例如,注意力權重、分數等)選擇最高分數的前 k 個元素作為池化的結果。在 NLP 任務中,這種方法通常用於從模型生成的可能性分數中選取前幾個可能的結果。
總之,"Multi-Head Attention Pooling"(多頭注意力池化)和 "Top-k Pooling"(前 k 個池化)都是在 Transformer 模型中使用的技術,用於整合注意力機制的輸出或從生成的分數中選取前幾個可能的結果,以支持模型的預測和生成。
- ### flash attention 是什麼?能舉實際例子?
[ChatGPT]
Flash attention 是一種讓深度學習模型可以在更高效的計算和記憶體使用下處理長序列的注意力機制。**它的設計旨在解決傳統注意力機制(如自注意力)在處理長序列時所遇到的計算和記憶體消耗問題**。
傳統的自注意力機制在處理長序列時需要計算大量的注意力分數,這將導致計算量和記憶體需求劇增,並可能導致性能下降。Flash attention 提出了一種稀疏注意力機制,它僅關注特定的子集詞,而不是每個詞都計算注意力分數。這使得模型能夠處理更長的序列,同時節省計算和記憶體成本。
舉個實際例子:
假設我們有一個長度為 1000 的句子,我們希望計算每個詞對於該句子中其他詞的注意力。在傳統的自注意力機制中,需要計算 1000 x 1000 個注意力分數,這是相當昂貴的。
而在 Flash attention 中,我們可以選擇只計算某些特定詞之間的注意力,比如只計算每個詞和它前面的 10 個詞之間的注意力。這樣,我們僅需計算 1000 x 10 個注意力分數,大大減少了計算量。
Flash attention 的精髓在於它能夠選擇性地關注重要的詞彙對,而不是計算所有可能的組合。這種方法在處理長序列時可以提高效率,同時保持模型的性能。
- ### batch size 是什麼?能舉實際例子?
[ChatGPT]
"Batch size" 是深度學習中的一個重要概念,它指的是在一次訓練中用來更新模型權重的樣本數量。簡單來說,它代表了每次模型在訓練過程中看到多少筆數據,然後進行一次權重更新。
舉個實際例子:
假設你有一個包含 1000 張手寫數字圖像的數據集,並且你正在訓練一個深度學習模型來識別這些圖像中的數字。如果你將 batch size 設置為 64,則在每次訓練迭代中,模型將從數據集中隨機選取 64 張圖像來進行處理。
在這個情況下,模型將逐批次地處理這 64 張圖像,計算它們的預測,然後計算預測和實際標籤之間的誤差(稱為損失)。接下來,模型使用損失來更新其權重,以改進對數字的識別能力。這個過程將在整個數據集上重複多次,直到模型達到滿意的性能水平。
Batch size 的選擇會影響訓練過程的速度和模型的性能。較大的 batch size 可能會加快訓練速度,但可能需要更多的內存。較小的 batch size 可以節省內存,但訓練過程可能需要更多的時間。因此,選擇適當的 batch size 是深度學習實驗中的一個重要考慮因素。
- ### warmup model
[ChatGPT]
"Warmup model" 通常指的是在訓練深度學習模型時的一個階段,這個階段的目的是在訓練開始時以較低的學習率(learning rate)進行一些較輕微的訓練,然後再逐漸提高學習率以進行實際的訓練。
這個概念的主要目的有兩個:
1. **穩定訓練**:在一開始時,模型的權重是隨機初始化的,它尚未"了解"訓練數據。將較低的學習率應用於這些隨機權重,有助於避免在訓練初期產生過大的權重更新,進而穩定訓練過程。
2. **避免陷入局部極值**:通過逐漸提高學習率,模型在訓練初期更容易跳出局部極值,並進一步搜索全局極值。
這個"暖身"(warmup)的階段通常是訓練過程的一個重要步驟,有助於確保深度學習模型能夠更快地收斂到合適的權重配置,提高訓練的效率和穩定性。
- ### 這兩個概念不互斥?
[ChatGPT]
"Warmup model" 通常包括兩個主要階段:
1. **初始學習率較低**:這個階段的目的是在訓練初期使用相對較低的學習率,以確保模型不會在訓練開始時產生過大的權重變化,從而穩定訓練過程。
2. **逐漸提高學習率**:隨著訓練的進行,學習率會逐漸增加。這有助於模型在訓練初期能夠更快地探索不同的權重空間,避免陷入局部極值,並在訓練過程中更好地收斂。
因此,這兩個概念並不互斥,而是一個在另一個之後發生的階段,以幫助模型在訓練過程中獲得更好的性能。謝謝你的指正,希望這次的解釋更加明確。
- ### 概念圖

- ### 推論階段呢?
在推論階段,"warmup model" 的概念通常不再適用於模型初始化或預訓練。相反,這裡的 "warmup" 意味著在實際使用模型進行推論之前,對模型進行一些預熱或預備操作。
在推論階段,"warmup model" 可能包括以下功能:
1. **模型載入**:在實際進行推論之前,首先需要將模型載入到內存中。這個過程可以被稱為 "warmup",因為它確保了模型在開始進行實際推論之前已經處於可用狀態。
2. **資源分配**:在某些情況下,模型需要分配計算資源(如GPU或CPU)。 "Warmup" 可能包括分配所需的資源以確保模型可以高效運行。
3. **性能優化**:在推論階段,可以進行一些性能優化操作,例如對模型進行輕量化或使用特定的優化器。這些操作可以被視為 "warmup",以確保模型在推論時表現良好。
總之,推論階段的 "warmup model" 涉及將模型載入內存、分配資源以及進行性能優化等操作,以確保模型在實際進行推論時表現出最佳性能。這有助於確保推論過程的高效運行。
- ### prefill stage and decode stage
- [name=diatango][time=Sep 14, 2023 17:08]
- prefill stage 就是先將使用者輸入的咒語, 計算出 kv cache
- 後續 decode 階段, 只要計算新產生的 token , 之前計算過的直接參考 kv cache 內容
- [LLM系列笔记:LLM Inference量化分析与加速](https://zhuanlan.zhihu.com/p/642272677)
- Inference过程:
- 有两个阶段Prefill Phase和Decoding Phase( FlexGen中讲的比较清楚)。
- 1)Prefill Phase:称为预处理/Encoding。计算并缓存每一层的key和value,其他的不需要缓存。每一个请求的prompt需要经过这个阶段,它只计算一次,是并行计算的。这个缓存称为KV Cache,KV Cache是整个解码过程中最为核心关键的一块。
- 2)Decoding Phase:生成新token阶段,它是串行的,也就是decode one by one。它用上一步生成的token,称为当前token放到input中,然后生成下一个token。具体包括两步,一是Lookup KV Cache计算并输出当前token最终embedding用来预测下一个token,二是缓存计算过程中得到的当前token在每一层的key和value,update到第一阶段Prefill Phase中的KV Cache中。
- [3. Background: LLM Inference](https://arxiv.org/pdf/2303.06865.pdf)
- i) the **prefill stage** which takes a prompt sequence to generate the key-value cache (KV cache) for each transformer layer of the LLM;
- ii) the **decoding stage** which utilizes and updates the KV cache to generate tokens step-by-step, where the current token generation depends on previously generated tokens.
- [SARATHI: Efficient LLM Inference by Piggybacking Decodes with Chunked Prefills](https://arxiv.org/abs/2308.16369)
Large Language Model (LLM) inference consists of two distinct phases - **prefill phase** which processes the input prompt and **decode phase** which generates output tokens autoregressively. While the prefill phase effectively saturates GPU compute at small batch sizes, the decode phase results in low compute utilization as it generates one token at a time per request. The varying prefill and decode times also lead to imbalance across micro-batches when using pipeline parallelism, resulting in further inefficiency due to bubbles.
大型語言模型(LLM)的推論包括兩個明確的階段 - 預備階段(prefill phase)處理輸入提示,以及解碼階段(decode phase)以自動回歸方式生成輸出標記(output tokens)。儘管在小批次大小下,預備階段能夠有效地飽和GPU計算資源,但解碼階段每次請求僅生成一個標記,因此計算資源利用率較低。此外,由於預備和解碼所需的時間不同,使用流水線並行處理時會導致微批次之間的不平衡,進一步降低效率並產生效能上的問題。
- [prefix LM和causal LM的区别](https://www.cnblogs.com/wanger-sjtu/p/17417312.html)
- attention mask不同,prefix LM的prefix部分的token互相能看到,causal LM严格遵守只有后面的token才能看到前面的token的规则。
- Prefill
- 对于causual LM,在正式推理前,需要一部分前置输入,这个过程就是Prefill。主要目的是产生 kv cache
- ### 為何在 llm 會有 shard 這個詞?它的用途是什麼?
在說明大型語言模型(LLM)時,"shard" 一詞通常指的是將模型的不同部分或層面分成較小的部分,以便進行管理、運行和分散式處理。這個詞在 LLM 上下文中有幾個常見的用途:
- **模型分割**: 大型語言模型,如 GPT-3、GPT-4 或其他類似的模型,可能包含數十億或數百億個參數。這樣的龐大模型難以一次性在單個 GPU 或設備上運行。因此,為了實現高效的訓練和推理,模型通常被分成多個 "shard",每個 "shard" 只包含模型的一部分參數。這樣,每個 "shard" 都可以在不同的設備上並行運行,從而提高了性能。
- **分散式計算**: 在大規模計算中心或集群中,LLM 可能會分散在多個計算節點上。每個節點可能負責處理模型的一個 "shard",並且可以根據需要協同工作以執行語言生成或處理任務。
- **快取和優化**: 在某些情況下,將模型分成 "shard" 有助於更好地管理模型的快取或記憶體使用。某些參數可能在特定計算或推理過程中不斷使用,因此可以更有效地存儲在快取中。
總之,"shard" 是為了處理龐大的 LLM 而引入的一種組織和分割策略,旨在實現更高的性能、更好的管理和更好的分散式處理。
<br>
## model
### Llama-2 vs Llama-2-chat
- [Llama 2: open source, free for research and commercial use](https://ai.meta.com/resources/models-and-libraries/llama/)

- Technical specifications
Llama 2 was pretrained on publicly available online data sources. The fine-tuned model, Llama-2-chat, leverages publicly available instruction datasets and over 1 million human annotations.
<br>
### OpenBMB / VisCPM
- [[github] OpenBMB / VisCPM](https://github.com/OpenBMB/VisCPM)


<br>
## training
- DP, TP, PP, ZeRo
- [深度学习并行训练算法一锅炖: DDP, TP, PP, ZeRO](https://zhuanlan.zhihu.com/p/581677880)
- Data parallelism (DP)
- Model Parallelism (MP)
- Pipeline Parallelism (PP)
- Tensor Parallelism (TP)

- Zero Redundancy Data Parallelism (ZeRO)

- ZeRO简单理解就是
- 给定 N 个设备,然后把一堆data等分到这些设备上,
- 每个设备只存 1/N 的数据量,并且每次也只负责更新这 1/N 的数据。
- [[HF🤗] Model Parallelism](https://huggingface.co/docs/transformers/v4.15.0/parallelism)
- 需求
- 將大的模型載入到有限的硬體上
- 加快訓練速度
### ZeRo
- [模型并行下利用ZeRO进行显存优化](https://zhuanlan.zhihu.com/p/619429610)
- [[源码解析] PyTorch 分布式之 ZeroRedundancyOptimizer](https://www.cnblogs.com/rossiXYZ/p/15782054.html)
- [Zero Redundancy Optimizers: A Method for training Machine Learning Models with Billion Parameters](https://oracle-oci-ocas.medium.com/472e8f4e7a5b)
### SpecInfer
- [7 Papers | GPT-4等大模型自己製作工具;識別ChatGPT造假](https://vitomag.com/tech/xnfun)
- 論文 4:SpecInfer: Accelerating Generative LLM Serving with Speculative Inference and Token Tree Verification
- 摘要:近日,來自卡耐基梅隆大學(CMU)的 Catalyst Group 團隊發佈了一款「投機式推理」引擎 SpecInfer,可以藉助輕量化的小模型來幫助大模型,在完全不影響生成內容準確度的情況下,實現兩到三倍的推理加速。
- [LLM推理提速2.8倍,CMU清華姚班校友提出「投機式推理」引擎SpecInfer,小模型撬動大模型高效推理](https://vitomag.com/tech/wtpd)
<br>
## Pre-train, pretrain, pre-training, 預訓練
- [[youtube]【生成式AI導論 2024】第7講:大型語言模型修練史 — 第二階段: 名師指點,發揮潛力 (兼談對 ChatGPT 做逆向工程與 LLaMA 時代的開始)](https://www.youtube.com/watch?v=Q9cNkUPXUB8)
<br>
## Continual Pre-training, 繼續預訓練
- [[Paper][PDF] Continual Pre-training of Language Models](https://arxiv.org/abs/2302.03241)
<br>
## Fine-Tune
### Mistral
- [A Beginner’s Guide to Fine-Tuning Mixtral Instruct Model](https://generativeai.pub/a-beginners-guide-to-fine-tuning-mixtral-instruct-model-7f6a30aacf61)
### LoRA
- ### [什么是LoRA模型,如何使用和训练LoRA模型?你想要的都在这!](https://zhuanlan.zhihu.com/p/624230991)
- ### LoRA 是什麼樣的技術?
[ChatGPT]
LoRA(Low-Rank Adaptation)是一種用於自然語言處理(NLP)領域的技術,特別是在語言模型微調方面。它的主要目的是提高語言模型的效能,同時減少計算和記憶體需求。
具體而言,LoRA 通常應用在大型語言模型,如 GPT(Generative Pre-trained Transformer)上。當微調這些模型以執行特定的 NLP 任務時,需要調整模型的參數,以使其更適合該任務。然而,直接微調大型模型可能需要大量的計算資源和時間。
LoRA 技術的主要思想是引入低秩參數化,這可以減少微調的參數數量,同時保持模型的性能。通過低秩參數化,LoRA 允許在微調過程中僅微調模型的部分參數,而不是全部。這樣可以減少微調所需的計算和記憶體,同時加速微調過程。
總的來說,LoRA 技術是為了更有效地執行 NLP 任務而設計的,特別針對大型語言模型的微調。它通常用於提高模型的效能,同時降低運行成本。
<br>
<hr>
<br>
### KV cache
- ### [[HackMD] KV cache](/3QigS6WWReemSuB4DQUxSQ)
<br>
<hr>
<br>
### 優化
- ### [淺談DeepLearning的浮點數精度FP32/FP16/TF32/BF16……..(以LLM為例)](https://medium.com/@averyaveavi/9bfb475e50be)
<br>
<hr>
<br>
## prompt
### fine tune
- [Llama2的多轮对话数据如何构建?](https://zhuanlan.zhihu.com/p/651306200)
> 原文:[NLP实践——Llama-2 多轮对话prompt构建](https://blog.csdn.net/weixin_44826203/article/details/131974846)
> 
```
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_message }} [/INST]
```
- [官方给出了一个很好的解释](https://www.reddit.com/r/LocalLLaMA/comments/155po2p/get_llama_2_prompt_format_right/)
- [How to Prompt Llama 2](https://huggingface.co/blog/llama2#how-to-prompt-llama-2)
- 單輪對話
`<s>[INST] <<SYS>>\n{{system_prompt}}\n<</SYS>>\n\n{{user_message}} [/INST]`
- 多輪對話
`<s>[INST] <<SYS>>\n{{system_prompt}}\n<</SYS>>\n\n{{user_message1}} [/INST] {{ model_answer_1 }} </s><s> [INST] {{ user_message2}} [/INST]`
- [玉林峰:一文看懂LLMs如何训练多轮对话数据](https://zhuanlan.zhihu.com/p/651293366)
- [ChatGLM2-6B多轮对话训练方式](https://zhuanlan.zhihu.com/p/651293366)
<br>
### chat_templates 產生器
- [chat_templates](https://github.com/chujiezheng/chat_templates)
- Example 1: llama-2-chat
- Example 2: vicuna
- Example 3: falcon-instruct
- [[huggingface] Templates for Chat Models](https://huggingface.co/docs/transformers/main/chat_templating) :+1: :100:
- code
```python=
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-70b-chat-hf")
chat = [
{
"role": "system",
"content": "You are a very clever LLM."
},
{
"role": "user",
"content": "Hello?"
},
{
"role": "assistant",
"content": "Hello."
},
{
"role": "user",
"content": "What are you thinking?"
},
]
tokenizer.apply_chat_template(chat, tokenize=False)
```
- 下載檔:
`$ ll /home/<USER>/.cache/huggingface/hub/`
- model 可以是 local file,但要填 file 的目錄路徑
- 必要檔案
- `tokenizer.json`
- `tokenizer_config.json`
- ==有定義 "chat_template" key==
- 選擇性檔案
- `special_tokens_map.json`
- `tokenizer.model`
- #### meta-llama/Llama-2-70b-chat-hf
`<s>[INST] <<SYS>>\nYou are a very clever LLM.\n<</SYS>>\n\nHello? [/INST] Hello. </s><s>[INST] What are you thinking? [/INST]`
- #### [mistralai/Mistral-7B-Instruct-v0.1](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1/blob/main/tokenizer_config.json#L32)
`<s>[INST] Hello? [/INST]Hello.</s> [INST] What are you thinking? [/INST]`
- Mistral 不支援 system prompt:
`TemplateError: Conversation roles must alternate user/assistant/user/assistant/...
- #### [mistralai/Mistral-7B-Instruct-v0.2](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2/blob/main/tokenizer_config.json#L42)
`<s>[INST] Hello? [/INST]Hello.</s>[INST] What are you thinking? [/INST]`
- v0.1: `</s> [INST]`
- v0.2: `</s>[INST]`
- #### bigscience/bloom-7b1
`You are a very clever LLM.</s>Hello?</s>Hello.</s>What are you thinking?</s>`
- #### lmsys/vicuna-7b-v1.5
**No chat template is defined for this tokenizer** - using the default template for the LlamaTokenizerFast class. If the default is not appropriate for your model, please set `tokenizer.chat_template` to an appropriate template. See https://huggingface.co/docs/transformers/main/chat_templating for more information.
`<s>[INST] <<SYS>>\nYou are a very clever LLM.\n<</SYS>>\n\nHello? [/INST] Hello. </s><s>[INST] What are you thinking? [/INST]`
<br>
### Llama2
- ### [implement prompt template for chat completion#717](https://github.com/abetlen/llama-cpp-python/issues/717)
- Llama-2
```
<s>[INST] <<SYS>>
You are a very clever LLM.
<</SYS>>
Hello? [/INST] Hello.</s><s>[INST] What are you thinking? [/INST] I think that
```
- Vicuna (and Mistral) (#role tag)
```
You are a very clever LLM.
USER: Hello?
ASSISTANT: Hello.</s>
USER: What are you thinking?
ASSISTANT: I think that
```
- ChatML
```
<|im_start|>system
You are a very clever LLM.<|im_end|>
<|im_start|>user
Hello?<|im_end|>
<|im_start|>assistant
Hello.<|im_end|>
<|im_start|>user
What are you thinking?<|im_end|>
<|im_start|>assistant
I think that
```
- [InternLM/chat/Cha Format](https://github.com/InternLM/InternLM/blob/main/chat/chat_format.md)
<br>
<br>
### codellama
- [CodeLLama Fine-tuning](https://billtcheng2013.medium.com/codellama-fine-tuning-7d40e6ad33b4)
```
prompt = f"<s>[INST] <<SYS>>\\n{system}\\n<</SYS>>\\n\\n{user}[/INST]"
```
<br>
### Mistral
- [[deepinfra] mistralai/Mistral-7B-Instruct-v0.1](https://deepinfra.com/mistralai/Mistral-7B-Instruct-v0.1)
- Instruction format
> In order to leverage instruction fine-tuning, your prompt should be surrounded by [INST] and [\INST] tokens. The very first instruction should begin with a begin of sentence id. The next instructions should not. The assistant generation will be ended by the end-of-sentence token id.
>
只有第一句要 `<s>`, 後面都不用 `<s>`
- [[huggingface] mistralai/Mistral-7B-Instruct-v0.1](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1)
E.g.
```
text = "<s>[INST] What is your favourite condiment? [/INST]"
"Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!</s> "
"[INST] Do you have mayonnaise recipes? [/INST]"
```
```python=
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1")
messages = [
{"role": "user", "content": "What is your favourite condiment?"},
{"role": "assistant", "content": "Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!"},
{"role": "user", "content": "Do you have mayonnaise recipes?"}
]
encodeds = tokenizer.apply_chat_template(messages, tokenize=False)
encodeds
```
執行結果:
`"<s>[INST] What is your favourite condiment? [/INST]Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!</s> [INST] Do you have mayonnaise recipes? [/INST]"`
- [[huggingface] mistralai/Mistral-7B-Instruct-v0.1 - discuss](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1/discussions/41)
[](https://hackmd.io/_uploads/HJlVPimtp.png)
```
<s>[INST] {instructions} {user_message1} [/INST] {bot_message1}</s>
[INST] {user_message2} [/INST] {bot_message2}</s>
[INST] {user_message3} [/INST] {bot_message3}</s>
```
<br>
## tokenizer
### Oneline Tokenizer
> 模型切割字串 DEMO:氣象局是專門介紹天氣的組織
- ### [llama-tokenizer playground](https://belladoreai.github.io/llama-tokenizer-js/example-demo/build/)
[](https://hackmd.io/_uploads/SknTG2mVp.png)
- ### [ChatGPT Tokenizer](https://platform.openai.com/tokenizer)

<br>
## libraries
### BLAS
> wiki: https://zh.wikipedia.org/zh-tw/BLAS
>
- ### Basic Linear Algebra Subprograms
用於執行基本線性代數運算的函式庫
運算包括:矩陣乘法、矩陣-向量乘法、矩陣的轉置和其他常見的線性代數運算。
- ### BLAS 是什麼意思?
[ChatGPT]
BLAS 代表 "Basic Linear Algebra Subprograms",簡單來說,它是一個用於執行基本線性代數運算的函式庫或 API 集合。這些基本線性代數運算包括矩陣乘法、矩陣-向量乘法、矩陣的轉置和其他常見的線性代數運算。
BLAS 函式庫的目的是提供高效且最佳化的實珽以執行這些基本線性代數運算,這對於科學計算、數值模擬、機器學習和其他需要大量線性代數計算的應用程式非常重要。通常,BLAS 函式庫會針對不同的硬體架構進行優化,以實現最佳的性能。
BLAS 函式庫的常見實現包括 OpenBLAS、Intel Math Kernel Library(MKL)、ATLAS 等,它們為開發者提供了一個可靠且高效的方式來執行線性代數運算,從而加速許多科學和工程計算應用。
<br>
## git
- ### git-lfs
[ChatGPT]
Git LFS (Large File Storage) 是 Git 的一個擴展,旨在處理大型二進制文件的版本控制。通常情況下,Git 是用於管理代碼的版本控制系統,而不是用於管理大型二進制文件,因為它對於這些文件的存儲和版本控制效率不高。
Git LFS 的主要功能是將大型文件(如圖像、音頻、視頻、數據集等)從 Git 存儲庫中提取出來,單獨存儲它們,然後僅在需要時下載它們。這樣可以降低存儲庫的大小,提高克隆和拉取操作的速度,並使 Git 在處理大型文件時更加高效。
使用 Git LFS,你可以:
1. **存儲大型文件**: 將大型文件單獨存儲在 Git LFS 服務中,而不是存儲在 Git 存儲庫中。
2. **輕鬆跟蹤版本**: Git LFS 仍然允許你跟蹤大型文件的版本,但它僅在需要時下載它們,而不是將它們包括在每個克隆和拉取操作中。
3. **高效的存儲和傳輸**: 由於大型文件不再佔用 Git 存儲庫的空間,存儲庫的大小會更小,並且 Git LFS 使用了優化的方式來傳輸這些文件,這使得 Git 操作更快速。
總之,Git LFS 是一個用於處理大型二進制文件的 Git 擴展,它改善了 Git 在這方面的性能和效率,特別適用於需要管理大型文件的代碼項目。