在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ChatGLM2-6B解析與TPU部署

jf_pJlTbmA9 ? 來(lái)源:jf_pJlTbmA9 ? 作者:jf_pJlTbmA9 ? 2023-08-18 11:28 ? 次閱讀

概述#

算能BM1684X芯片已經(jīng)實(shí)現(xiàn)ChatGLM2-6B的C++代碼部署,代碼實(shí)現(xiàn)鏈接:https://github.com/sophgo/ChatGLM2-TPU。

本文總結(jié)部署該模型過(guò)程中的一些技術(shù)點(diǎn)。首先是ChatGLM2-6B的整體運(yùn)行流程,然后介紹如何將該動(dòng)態(tài)網(wǎng)路轉(zhuǎn)換成靜態(tài)網(wǎng)絡(luò)形式,接著介紹如何將該模型導(dǎo)出成ONNX。

最后如何將ONNX使用TPU-MLIR編譯器實(shí)現(xiàn)網(wǎng)絡(luò)的編譯以及用C++代碼編寫(xiě)應(yīng)用程序,可以直接看源碼就可以理解,這里不做介紹。

ChatGLM2-6b運(yùn)行流程#



wKgaomTeyYuAGAEHAAOdqNVoTSg583.png

如圖該網(wǎng)絡(luò)基本上可以分為5個(gè)階段:

將句子通過(guò)分詞器(使用google的sentencepiece)轉(zhuǎn)換成tokens,如圖中的<1x17 xi32>的數(shù)據(jù)。注意tokens里面64790, 64792是起始符號(hào)。

通過(guò)WordEmbedding將tokens轉(zhuǎn)換成詞向量,得到的結(jié)果是<1x17x4096 xf32>的數(shù)據(jù)。

通過(guò)Tranformer進(jìn)行神經(jīng)網(wǎng)絡(luò)推理,推理結(jié)果是<1x17x4096 xf32>,答案在最后的詞向量上,所以做一個(gè)額外的slice操作,得到<1x1x4096 xf32>。這里Transformer網(wǎng)絡(luò)是由28個(gè)Block組成,每個(gè)Block的核心是一個(gè)Attention運(yùn)算,并輸出kv cache給下一輪Transform做為輸入。

經(jīng)過(guò)LmHead操作生成<1x1 xi32>的結(jié)果,也就是輸出的Token。LmHead的組成如圖所示。

Token經(jīng)過(guò)分詞器轉(zhuǎn)成詞語(yǔ),且傳遞給下一輪推理,進(jìn)入第一階段。直到token == EOS_ID結(jié)束。

轉(zhuǎn)成靜態(tài)網(wǎng)絡(luò)#

ChatGLM2-6B從前面的描述中,可以看到有兩處是動(dòng)態(tài)的,一是因句子的長(zhǎng)短不同,Transformer的輸入Shape有所有不同;二是每一輪Transformer生成的kv cache會(huì)逐步增長(zhǎng)。為了方便部署,根據(jù)網(wǎng)絡(luò)特點(diǎn)轉(zhuǎn)換成靜態(tài)網(wǎng)絡(luò)。轉(zhuǎn)換后的運(yùn)行流程如下:

wKgZomTeyY6AFQEgAAW1_ICPg_Q001.png

從圖中可以看到句子不論長(zhǎng)短,轉(zhuǎn)換后的tokens始終是<1x512x i32>,kv cache的數(shù)據(jù)也始終是<512x1x2x128x f32>。

這里介紹最關(guān)鍵的幾點(diǎn):

將原始tokens輸入尾部補(bǔ)0,從<1x17x i32>轉(zhuǎn)換成<1x512x i32>。

將position_ids從GlmBlock中提取出來(lái),并固定長(zhǎng)度為<1x512x i32>,也是尾部補(bǔ)0,本例中的數(shù)值為[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,0,0,0,...0],用于位置編碼。因?yàn)樵谠季W(wǎng)絡(luò)中這部分是變長(zhǎng),提取出來(lái)后就可以做成定長(zhǎng)。

將attention_mask從GlmBlock中提取出來(lái),并固定長(zhǎng)度為<1x512x512x f32>,注意無(wú)效部分全部補(bǔ)1,因?yàn)樗髸?huì)有masked_fill操作將mask為1的部分全部配置為-inf。然后經(jīng)過(guò)Softmax使超出部分全部清0,保留有效部分,從而保證最終結(jié)果與原始結(jié)果一致。如下圖,為說(shuō)明問(wèn)題,Attention做了簡(jiǎn)化。

wKgaomTeyZKAcEiQAANk81R4E_M592.png

第一輪Transformer后,kv_chache有效部分是[0:17],我們將該部分移到末尾[512-17:],并頭部清0。因?yàn)閗v cache的累加發(fā)生在尾部。從第二輪開(kāi)始累加后做Slice操作去掉頭部1個(gè)單位,取[1:],這樣就保證了kv cache始終保持在512。同時(shí)attention mask也要是從尾部實(shí)際token len長(zhǎng)度的0,頭部全部置1。

導(dǎo)出ONNX#

將該網(wǎng)絡(luò)分為4塊:WorkEmbedding,GlmBlock,GlmBlockCache,LmHead。這里分別介紹這四塊是如何導(dǎo)出的。

導(dǎo)出前,先要指定python路徑,如下:

1
export PYTHONPATH=/workspace/chatglm2-6b:$PYTHONPATH

需要先加載原始ChatGLM2-6B,如下代碼:

1
2
3
4
5
6
7
8
9
10
11
CHATGLM2_PATH = "/workspace/chatglm2-6b"

origin_model = AutoModel.from_pretrained(CHATGLM2_PATH,
                                         trust_remote_code=True).float()
origin_model.eval()
transformer = origin_model.transformer
MAX_LEN = transformer.seq_length
for param in origin_model.parameters():
    param.requires_grad = False
num_layers = transformer.encoder.num_layers
layers = transformer.encoder.layers

WorkEmbedding#

直接使用原模型中的word_embeddings,構(gòu)建成獨(dú)立網(wǎng)絡(luò),導(dǎo)出即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Embedding(torch.nn.Module):

    def __init__(self):
        super().__init__()

    def forward(self, input_ids):
        return transformer.embedding.word_embeddings(input_ids)

def convert_embedding():
    model = Embedding()
    torch.onnx.export(model, (torch.tensor([0, 1, 2, 3])),
                      f'./tmp/embedding.onnx',
                      verbose=False,
                      input_names=['input_ids'],
                      output_names=['input_embed'],
                      dynamic_axes={"input_ids": {0: "length"}},
                      do_constant_folding=True,
                      opset_version=15)

GlmBlock#

需要將transformer.rotary_pos_emb和transformer.encoder.layers組合構(gòu)建獨(dú)立網(wǎng)路,導(dǎo)出。因?yàn)橛?8個(gè)block,所以需要導(dǎo)出28個(gè)ONNX模型。這里的position_ids和attention_mask作為外部輸入,前面有介紹。其實(shí)這28個(gè)Block是可以組合成一個(gè)模型,但是這樣導(dǎo)致onnx權(quán)重過(guò)大(F16約12GB),導(dǎo)出麻煩,部署也麻煩,所以單個(gè)導(dǎo)出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class GlmBlock(torch.nn.Module):

    def __init__(self, layer_id):
        super().__init__()
        self.layer = layers[layer_id]

    def forward(self, hidden_states, position_ids, attention_mask):
        rotary_pos_emb = transformer.rotary_pos_emb(MAX_LEN)[position_ids]
        rotary_pos_emb = rotary_pos_emb.transpose(0, 1).contiguous()
        hidden_states, past_kv = self.layer(hidden_states, attention_mask,
                                            rotary_pos_emb=rotary_pos_emb)
        return hidden_states, past_kv

def convert_glm_block(layer_id):
    model = GlmBlock(layer_id)
    torch.onnx.export(
        model, (hidden_states, position_ids, attention_mask),
        f'./tmp/glm_block_{layer_id}.onnx',
        verbose=False,
        input_names=['input_states', 'position_ids', 'attention_mask'],
        output_names=['hidden_states', 'past_k', 'past_v'],
        do_constant_folding=True,
        opset_version=15)

GlmBlockCache#

與`GlmBlock是類(lèi)似的,但是需要額外的kv cache參數(shù)。注意這里 最后會(huì)把頭部1個(gè)單位去除掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class GlmBlockCache(torch.nn.Module):
    def __init__(self, layer_id):
        super().__init__()
        self.layer = layers[layer_id]

    def forward(self, hidden_states, position_ids, attention_mask, past_k, past_v):
        rotary_pos_emb = transformer.rotary_pos_emb(MAX_LEN)[position_ids]
        rotary_pos_emb = rotary_pos_emb.transpose(0, 1).contiguous()
        hidden_states, past_kv = self.layer(hidden_states, attention_mask,
                                            kv_cache=(past_k, past_v),
                                            rotary_pos_emb=rotary_pos_emb)
        past_k, past_v = past_kv
        return hidden_states, past_k[1:], past_v[1:]

def convert_glm_block_cache(layer_id):
    model = GlmBlockCache(layer_id)
    torch.onnx.export(
        model, (hidden_states, position_ids, attention_mask, past_k, past_v),
        f'./tmp/glm_block_cache_{layer_id}.onnx',
        verbose=False,
        input_names=['input_states', 'position_ids', 'attention_mask', 'history_k', 'history_v'],
        output_names=['hidden_states', 'past_k', 'past_v'],
        do_constant_folding=True,
        opset_version=15)

LmHead#

這里取m_logits后使用topk,其實(shí)也是可以用argmax,看芯片實(shí)現(xiàn)哪一種效率高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class LmHead(torch.nn.Module):
    def __init__(self):
        super().__init__()
    def forward(self, hidden_states):
        hidden_states = transformer.encoder.final_layernorm(hidden_states)
        m_logits = transformer.output_layer(hidden_states)
        _, token = torch.topk(m_logits, 1)
        return token
def convert_lm_head():
    model = LmHead()
    input = torch.randn(1, 4096)
    torch.onnx.export(model, (input), f'./tmp/lm_head.onnx', verbose=False,
                      input_names=['hidden_states'],
                      output_names=['token'],
                      do_constant_folding=True,
                      opset_version=15)

部署#

上述轉(zhuǎn)完ONNX模型后都已經(jīng)是靜態(tài)網(wǎng)絡(luò),通過(guò)TPU-MLIR,可以很容易的轉(zhuǎn)換成F16的模型。但是特別要注意的是RmsNorm需要用F32。之后就可以按照?qǐng)?zhí)行邏輯編寫(xiě)C++代碼。演示效果如下:

wKgZomTeyZmAfYNvAAyggAMVdCw548.png

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    459

    文章

    51988

    瀏覽量

    434237
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    665

    瀏覽量

    30084
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2116

    瀏覽量

    74639
  • TPU
    TPU
    +關(guān)注

    關(guān)注

    0

    文章

    151

    瀏覽量

    21042
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【算能RADXA微服務(wù)器試用體驗(yàn)】Radxa Fogwise 1684X Mini 規(guī)格

    ChatGLM2-6B、AIGC、Llama2、SAM、Whisper等超大參數(shù)模型 還有一份詳細(xì)的英文的規(guī)格表: 另外,算能RADXA微服務(wù)器服務(wù)器,還是大學(xué)生集成電路創(chuàng)新創(chuàng)業(yè)大賽之# 第八屆集創(chuàng)賽杯賽題目
    發(fā)表于 02-28 11:21

    CORAL-EDGE-TPU:珊瑚開(kāi)發(fā)板TPU

    :1 GB LPDDR4閃存:8 GB eMMC無(wú)線:Wi-Fi 2x2 MIMO(802.11b / g / n / ac 2.4 / 5GHz)藍(lán)牙4.1尺寸:48mm x 40mm x 5mm
    發(fā)表于 05-29 10:43

    TPU透明副牌.TPU副牌料.TPU抽粒廠.TPU塑膠副牌.TPU再生料.TPU低溫料

    ,透明.白色.黑色. 改性料. 2.TPU擠出.留延.氣動(dòng)管TPU料、管材TPU料、條TPU料、封邊條TPU料、裝飾條
    發(fā)表于 11-21 17:21

    TPU副牌低溫料.TPU熱熔料.TPU中溫料.TPU低溫塑膠.TPU低溫抽粒.TPU中溫塑料

    清源塑膠公司.供應(yīng)TPU塑膠原料.副牌.再生顆粒料.TPU塑膠.TPU透明副牌. 再生粒子.白色.黑色.透明. 注塑料.擠出料. 壓延等等..聚醚. 脂肪料. 聚酯料.硬度70A--98A. 高硬度
    發(fā)表于 11-21 17:33

    供應(yīng)TPU抽粒工廠.TPU再生工廠.TPU聚醚料.TPU聚酯料.TPU副牌透明.TPU副牌.TPU中低溫料

    清源塑膠經(jīng)營(yíng).進(jìn)口.國(guó)內(nèi).供應(yīng)TPU原料.副牌TPU塑膠.TPU透明副牌. 再生粒子.白色.黑色.透明. 注塑料.擠出料. 壓延等等..聚醚. 脂肪料. 聚酯料.硬度70A--98A. 高硬度
    發(fā)表于 11-21 17:47

    清華系千億基座對(duì)話模型ChatGLM開(kāi)啟內(nèi)測(cè)

    ChatGLM-6B 使用了和 ChatGLM 相同的技術(shù),針對(duì)中文問(wèn)答和對(duì)話進(jìn)行了優(yōu)化。經(jīng)過(guò)約 1T 標(biāo)識(shí)符的中英雙語(yǔ)訓(xùn)練,輔以監(jiān)督微調(diào)、反饋?zhàn)灾⑷祟?lèi)反饋強(qiáng)化學(xué)習(xí)等技術(shù)的加持,62 億參數(shù)的 ChatGLM-6B 雖然規(guī)模不
    的頭像 發(fā)表于 03-17 13:47 ?2259次閱讀

    ChatGLM-6B的局限和不足

    基于ChatGLM-6B 部署本地私有化ChatGPT 一、開(kāi)源模型 1、ChatGLM-6B介紹 清華大學(xué)知識(shí)工程 (KEG) 實(shí)驗(yàn)室和智譜AI公司與于2023年共同訓(xùn)練的語(yǔ)言模型
    的頭像 發(fā)表于 06-25 11:50 ?5721次閱讀
    <b class='flag-5'>ChatGLM-6B</b>的局限和不足

    ChatGLM2-6B:性能大幅提升,8-32k上下文,推理提速42%,在中文榜單位列榜首

    在主要評(píng)估LLM模型中文能力的 C-Eval 榜單中,截至6月25日 ChatGLM2 模型以 71.1 的分?jǐn)?shù)位居 Rank 0 ,ChatGLM2-6B 模型以 51.7 的分?jǐn)?shù)位居 Rank
    的頭像 發(fā)表于 06-26 14:30 ?1222次閱讀
    <b class='flag-5'>ChatGLM2-6B</b>:性能大幅提升,8-32k上下文,推理提速42%,在中文榜單位列榜首

    下載量超300w的ChatGLM-6B再升級(jí):8-32k上下文,推理提速42%

    ,允許更多輪次的對(duì)話。但當(dāng)前版本的 ChatGLM2-6B 對(duì)單輪超長(zhǎng)文檔的理解能力有限,我們會(huì)在后續(xù)迭代升級(jí)中著重進(jìn)行優(yōu)化。
    的頭像 發(fā)表于 06-29 16:15 ?1527次閱讀
    下載量超300w的<b class='flag-5'>ChatGLM-6B</b>再升級(jí):8-32k上下文,推理提速42%

    適用于各種NLP任務(wù)的開(kāi)源LLM的finetune教程~

    ChatGLM2-6b是清華開(kāi)源的小尺寸LLM,只需要一塊普通的顯卡(32G較穩(wěn)妥)即可推理和微調(diào),是目前社區(qū)非常活躍的一個(gè)開(kāi)源LLM。
    的頭像 發(fā)表于 07-24 09:04 ?1941次閱讀
    適用于各種NLP任務(wù)的開(kāi)源LLM的finetune教程~

    基于ChatGLM2和OpenVINO?打造中文聊天助手

    ChatGLM 是由清華大學(xué)團(tuán)隊(duì)開(kāi)發(fā)的是一個(gè)開(kāi)源的、支持中英雙語(yǔ)的類(lèi) ChatGPT 大語(yǔ)言模型,它能生成相當(dāng)符合人類(lèi)偏好的回答, ChatGLM2 是開(kāi)源中英雙語(yǔ)對(duì)話模型 ChatGLM 的第二代版本,在保留了初代模型對(duì)話流
    的頭像 發(fā)表于 08-24 17:13 ?1541次閱讀
    基于<b class='flag-5'>ChatGLM2</b>和OpenVINO?打造中文聊天助手

    探索ChatGLM2在算能BM1684X上INT8量化部署,加速大模型商業(yè)落地

    |探索ChatGLM2-6B模型與TPU部署》。為了進(jìn)一步提升模型的推理效率與降低存儲(chǔ)空間,我們對(duì)模型進(jìn)行了INT8量化部署,整體性能提升70%以上,模型大小降低到
    的頭像 發(fā)表于 10-10 10:18 ?4303次閱讀
    探索<b class='flag-5'>ChatGLM2</b>在算能BM1684X上INT8量化<b class='flag-5'>部署</b>,加速大模型商業(yè)落地

    ChatGLM3-6B在CPU上的INT4量化和部署

    ChatGLM3 是智譜 AI 和清華大學(xué) KEG 實(shí)驗(yàn)室聯(lián)合發(fā)布的新一代對(duì)話預(yù)訓(xùn)練模型。ChatGLM3-6BChatGLM3 系列中的開(kāi)源模型,在填寫(xiě)問(wèn)卷進(jìn)行登記后亦允許免費(fèi)商業(yè)使用。
    的頭像 發(fā)表于 01-05 09:36 ?1276次閱讀
    <b class='flag-5'>ChatGLM3-6B</b>在CPU上的INT4量化和<b class='flag-5'>部署</b>

    三步完成在英特爾獨(dú)立顯卡上量化和部署ChatGLM3-6B模型

    ChatGLM3 是智譜 AI 和清華大學(xué) KEG 實(shí)驗(yàn)室聯(lián)合發(fā)布的新一代對(duì)話預(yù)訓(xùn)練模型。ChatGLM3-6BChatGLM3 系列中的開(kāi)源模型,在填寫(xiě)問(wèn)卷進(jìn)行登記后亦允許免費(fèi)商業(yè)使用。
    的頭像 發(fā)表于 01-11 18:04 ?2040次閱讀
    三步完成在英特爾獨(dú)立顯卡上量化和<b class='flag-5'>部署</b><b class='flag-5'>ChatGLM3-6B</b>模型

    chatglm2-6b在P40上做LORA微調(diào)

    背景: 目前,大模型的技術(shù)應(yīng)用已經(jīng)遍地開(kāi)花。最快的應(yīng)用方式無(wú)非是利用自有垂直領(lǐng)域的數(shù)據(jù)進(jìn)行模型微調(diào)。chatglm2-6b在國(guó)內(nèi)開(kāi)源的大模型上,效果比較突出。本文章分享的內(nèi)容是用
    的頭像 發(fā)表于 08-13 17:12 ?727次閱讀
    <b class='flag-5'>chatglm2-6b</b>在P40上做LORA微調(diào)
    主站蜘蛛池模板: 亚洲h视频| 手机看片1024手机在线观看 | 国产一级特黄aaaa大片野外 | 狠狠色噜噜狠狠狠狠米奇7777 | 综合色区 | 天天摸夜夜添狠狠添2018 | 日本巨黄视频 | 天堂在线免费视频 | 欧美在线bdsm调教一区 | 中日韩精品视频在线观看 | 色噜噜人体337p人体 | 可以免费观看的一级毛片 | 亚洲一区二区三区免费在线观看 | 99热色| 69xxxxxxxxxhd日本| 久久婷婷人人澡人人爱91 | 亚洲精品国产成人 | 美女丝袜长腿喷水gif动态图 | 久久综合成人网 | 国产免费午夜高清 | 能看的黄色网址 | 国产精品不卡片视频免费观看 | 午夜免费成人 | 717影院理伦午夜论八戒 | 免费一级特黄 | 在线观看天堂 | 酒色影院| 朋友夫妇和交换性bd高清 | 亚洲图片欧美色图 | 天天躁夜夜躁狠狠躁2021 | 国产精品久线观看视频 | 94久久国产乱子伦精品免费 | 国产18到20岁美女毛片 | 天天色综合天天 | 午夜手机福利视频 | 欧美黑粗特黄午夜大片 | 白嫩美女一级高清毛片免费看 | 激情五月婷婷小说 | 日本一卡二卡≡卡四卡精品 | 成 黄 色 激 情视频网站 | 亚洲色图17p |