日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

大象轉身,TPU-MLIR適配DragGAN模型前向操作

算能開發(fā)者社區(qū) ? 2023-10-10 10:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

DragGAN

DragGAN是由谷歌、麻省理工學院和馬克斯普朗克研究所創(chuàng)建的一種新的人工智能模型。

通過點擊、拖動等簡單的交互操作就能改變拍攝對象的姿勢、形狀和表情等。

DragGAN改變了傳統(tǒng)的PS操作流程,只需簡單拖拽起點和終點,AI就會根據(jù)圖像的變化自動生成和補全圖像。

DragGAN可處理的圖像類型豐富多樣,無論是人類表情的調整還是自然風景的變化,都可以在瞬息之內輕松實現(xiàn)。

DragGAN的全流程包含一個基于Generator的前向操作和反向傳播過程。本文主要介紹在TPU-MLIR上適配DragGAN模型的前向操作的全部過程。

模型移植

推理代碼定位與模型導出

適配的模型代碼使用 XingangPan/DragGAN: Official Code for DragGAN (SIGGRAPH 2023) (github.com) ,模型的入口在 DragGAN/viz/renderer.py:357,可以在這里直接引入TPU-MLIR提供的 gen_shell 工具,直接 trace 生成 workspace 文件夾,onnx/pt 模型,以及默認的轉換腳本:

fromutils.gen_shellimportgenerate
generate(
"DragGan",
G,
dict(
ws=ws,
c=label
),
"../draggan_workspace",
)

運行源碼 README.md 中提供的腳本 python visualizer_drag_gradio.py,運行成功后可以在在同級目錄下得到如下的目錄結構:

draggan_workspace
├──cali_data
│└──data.npz
├──convert.sh
├──DragGan.onnx
├──DragGan.pt
├──data.npz
└──cali_data

模型移植過程中錯誤的分析和解決

RuntimeError: Op not support:{'RandomNormalLike'}

在 model_transform 階段,發(fā)現(xiàn)存在不支持的算子 RandomNormalLike:

23bff33c-6713-11ee-9788-92fbcf53809c.png

RandomNormalLike(隨機數(shù)相關)的算子 1684x 無法支持,所以必須嘗試在原模型中避開這些算子。定位到模型代碼處,發(fā)現(xiàn)該算子用于提供一個噪音供下游使用。源碼中提供了三種噪音生成方式,分別是 random(隨機噪音),const(常量噪音),和 none(不提供噪音),因此可以通過設置 noise_mode = const 避開這一算子的使用。

23d00a6a-6713-11ee-9788-92fbcf53809c.png

對 Conv/DeConv Filter 為動態(tài)輸入情況的支持

DragGan 的模型結構中,有一部分 Conv 和 DeConv 的輸入是固定權重,而 FilterOp 部份是動態(tài)的從上游計算得到的輸入。這種情況在這之前未做考慮,需要添加支持。這包括在多個地方的代碼更改。下面通過具體的報錯提示來一步步分析、定位和解決。

model_transform 階段

在 tpu-mlir 的 Converter 中,權重(weight)和 動態(tài)輸入(dynamic input)存儲在不同的變量中,其中,weight 通過 getWeightOp(name) 獲取,input 通過 getOperand(name) 獲取。如果不確定 op 是 dynamic input 還是 weight,可以使用 getOp(name) 來獲取。而在對 DragGan 的 model_transform.py 腳本的運行過程中,會遇到如下的報錯KeyError: '/synthesis/b8/conv0/Transpose_output_0'

23e4a79a-6713-11ee-9788-92fbcf53809c.png

此時對應模型結構,發(fā)現(xiàn)該 DeConv 的輸入 /synthesis/b8/conv0/Transpose_output_0 是作為一個 Weight 獲取的。

23f183c0-6713-11ee-9788-92fbcf53809c.png

因此將ConvTranspose 的 filter_opd 的獲取邏輯改為 getOp 即可

2404748a-6713-11ee-9788-92fbcf53809c.png

同理,另外一個 KeyError 中,DeConv 的 filter 來自于動態(tài)輸入,所以同理,將 DeConv 獲取 filter 結點的邏輯同樣改為 getOp。

241726d4-6713-11ee-9788-92fbcf53809c.png

在 model_transform 階段, 模型會首先轉換到DragGAN_origin.mlir,再經(jīng)過--shape-infer,--canonicalize 等過程,轉換為可以通過model_runner.py做推理的 Top Dialect 描述的 mlir 文件。在對 Top 層做推理驗證正確性時,DragGan 模型報出了精度為零的錯誤。通過觀察輸出的錯誤信息,發(fā)現(xiàn)是在 DeConv 層之后精度出現(xiàn)問題的,而且僅在 DeConv 的 filter 是動態(tài)輸入的情況下會有這一問題。

構建了一個 filter 是動態(tài)輸入的 DeConv 作為單側,復現(xiàn)該錯誤成功:

classDeConvCase(nn.Module):
def__init__(self)->None:
super().__init__()
self.deconv=nn.ConvTranspose2d(4,4,[2,2],stride=[1,1],bias=False)
self.deconv.weight.data=weight

defforward(self,x,y):
output_padding=self.deconv._output_padding(
x,
None,
[2,2],
[0,0],
[2,2],
1,
[1,1],
)

out=F.conv_transpose2d(x,y,None,[1,1],0,output_padding,1,1)

returnout,self.deconv(x)

此時通過斷點調試,發(fā)現(xiàn)錯誤原因有兩個:

  • 正確性驗證階段推理時,在 init() 時設置權重,此時 weight 還沒有設置
  • 動態(tài)輸入時沒有做對應的權重重排(WeightReorder)

tpu-mlir 在適配模型的過程會經(jīng)過多步轉換和多次優(yōu)化,為了保證轉換后的正確性,tpu-mlir 會做三次正確性驗證,分別針對 Top Dialect,Tpu Dialect 和 bmodel。Top 和 Tpu 層的正確性的核心代碼位于 ModuleInterpreter.[h/cpp],該過程會從輸入開始,對每一個 Op 分配空間,進行初始化(init),在初始化結束后進行推理(inference),并在最終對每個 Op 進行析構(deinit)。而 DeConv 的精度錯誤之一則來自于 Inference 階段時 init 和 inference 的分離。

在 init 時,DeConv 會構造一個 Dnnl 的實例,此時會直接 copy 一份 Weight 在 Dnnl 實例中,但由于該 filter 為動態(tài)輸入, init 時值還沒有傳入,所以傳入的 filter 的值實質上是全零。導致在 inference 階段出現(xiàn)錯誤。定位后該問題比較好改,將 init 過程中對 Dnnl 實例的 setup 移到 inference 階段即可。Conv 也有同樣的問題,修改邏輯相同。

24318ca4-6713-11ee-9788-92fbcf53809c.png

對 onnx 模型,DeConv 的 filter 的權重存儲方式是 input channel first(即 shape 為 [ic, oc, kw, kh]),而后端的計算過程大多都需要 output channel first([oc, ic, kw, kh]),可以注意到 OnnxConverter 中,原本對 DeConv 的權重會存在一個轉置操作:

24527a72-6713-11ee-9788-92fbcf53809c.png

而動態(tài)權重自然沒有辦法實現(xiàn)這一操作。因此,需要添加一個圖優(yōu)化,當 DeConv 的 filter 是動態(tài)時,在其前面添加一個 [oc, ic] 互換的 Permute 操作。在添加 Permute 操作時,需要仔細考慮 DeConv 添加這一 Permute 的先決條件。確保該 Permute 添加是針對 DeConv 的動態(tài)權重,且同時不會重復添加。因此考慮在 DeConv 的 Operation 結構中添加 bool 類型的 dynweight_reorderd 參數(shù)。當 filter 不是 top.WeightOp (使用動態(tài)權重)且 dynweight_reordered 為 false (沒有添加對動態(tài) weight 的 Permute)時,添加這一 Permute,同時設置 dynweight_reorderd 參數(shù)為 true。

在 TopOps.td 文件對 DeConv 添加 dynweight_reorderd 參數(shù)后,對 DeConv 動態(tài)權重的圖優(yōu)化邏輯如下:

structReorderDynWeight:publicOpRewritePattern{
usingOpRewritePattern::OpRewritePattern;

LogicalResultmatchAndRewrite(DeconvOpop,
PatternRewriter&rewriter)constoverride{

autofilter_shape=module::getShape(op.getFilter());//or

if(module::isWeight(op.getOperand(1))){
returnfailure();
}
booldyn_weight_reorderd=op.getDynweightReorderd();
if(dyn_weight_reorderd){
returnfailure();
}

if(isa(op.getOperand(1).getDefiningOp())){
autopermute_op=
dyn_cast(op.getOperand(1).getDefiningOp());

//eraseifalreadyhavethispermutebutfromoriginalgraph
std::vector<int64_t>ps={1,0,2,3};
autoorder=module::getI64Array(permute_op.getOrder());
if(*order==ps){
permute_op.replaceAllUsesWith(permute_op.getInput());
rewriter.eraseOp(permute_op);
op.setDynweightReorderd(true);
returnsuccess();
}
}

rewriter.setInsertionPointAfterValue(op.getFilter());
std::stringname=module::getName(op.getOutput()).str();
autoloc=
NameLoc::get(rewriter.getStringAttr(name+"_reorder_permute"));

std::vector<int64_t>order={1,0};
autofilter_dim=filter_shape.size();
for(inti=2;iorder.push_back(i);
}

autop_type=
UnrankedTensorType::get(module::getElementType(op.getFilter()));
std::vectorattrs;
attrs.emplace_back(
rewriter.getNamedAttr("order",rewriter.getI64ArrayAttr(order)));

autonew_permute_op=rewriter.create(
loc,p_type,ValueRange{op.getFilter()},attrs);

new_permute_op.shape_inference();
op.setOperand(1,new_permute_op.getOutput());
op.setDynweightReorderd(true);
returnsuccess();
}
};

這里做了一個額外的判斷,當 DeConv 的 filter 位置已經(jīng)是 Permute 且其 order 和要添加的 Permute 一樣(1,0,2,3)時,兩個 Permute 可以直接融合,所以此時可以直接刪除該 Permute 并返回。其他的情況則是插入一個額外的 Permute 操作。Conv 層同樣要支持動態(tài) weight 的權重重排,要添加一個相同的圖優(yōu)化。

此外,Top 層的 shape-infer 要早于圖優(yōu)化,因此在做 shape-infer 時動態(tài) weight 的 shape 仍然還是 input channle first,所以 DeConv 的 output_shape 的 dim[1] 應該基于 filter_shape[1] 來判斷。對應的修改位于 lib/Dialect/Top/Interfaces/Deconv.cpp:

2461b438-6713-11ee-9788-92fbcf53809c.png

bmodel 運行錯誤 ASSERT /workspace/nntoolchain/TPU1686/bm1684x/cmodel/src/cmodel_common.cpp: gather_data: 207: dst_offset < (1<<18)

在大模型中定位這一錯誤較難,因此可以通過 mlir_cut.py 逐步縮小范圍,得到了最小可復現(xiàn)的 mlir:

2471cbe8-6713-11ee-9788-92fbcf53809c.png

mlir_cut.py--mlir*tpu.mlir--output_names/synthesis/b64/conv0/Conv_output_0_Conv--input_names/synthesis/b32/conv1/Mul_3_output_0_Mul,/synthesis/b64/conv0/Reshape_3_output_0_Reshape

tpuc-optDragGan_bm1684x_f32_final.mlir--codegen="model_file=DragGan_f32.bmodelembed_debug_info=true"-o/dev/null
model_runner.py--inputfake_data.npz--modelDragGan_f32.bmodel--outputDragGan_bm1684x_f32_model_outputs.npz

進一步構建了能夠復現(xiàn)該錯誤的單元測試:

24822fd8-6713-11ee-9788-92fbcf53809c.png

通過控制變量,得到了以下現(xiàn)象:

  • 關閉 layer-group,模型運行正常不報錯:這說明問題基本是出在 tpu-mlir 部份而不是后端算子部份
  • 將上述的代碼中 DeConv 的 filter 從動態(tài)改為靜態(tài),模型運行正常:說明問題仍然是動態(tài) Weight 導致的
  • 構建基本的 DeConv 算子,無論是靜態(tài)和動態(tài)都運行正常,和上面的單側進行對比,發(fā)現(xiàn)區(qū)別在單個 DeConv 算子不會進行 LayerGroup:將問題定位到 tpu-mlir 的 LayerGroup 部份的代碼

此時進一步對比正常和出錯的 final.mlir,發(fā)現(xiàn) dynamic weight 和 weight 的 slice 屬性不一致,如下所示:

249748be-6713-11ee-9788-92fbcf53809c.png

top.Weight 的 layer-group 是比較特殊。top.Weight 在整個 layer-group 都保存在 local memory 中(hold_in_lmem = true);同時,weight 也不能切分 slice,每個 slice 都要用到完成的 filter,從而導致結果錯誤。

所以需要單獨針對 dynamic weight 處理,這包括設置其生命周期(hold_in_mem = true),以及將其 slice 設置為長度為 1,元素為其 shape 對應維度值的列表。這一過程可以在 lib/Dialect/Tpu/Transforms/LayerGroup/LayerGroupUtil.cpp 的 backward_update_slice 方法中完成:

24ad9fba-6713-11ee-9788-92fbcf53809c.png

優(yōu)化后再對比兩個單例的 final.mlir,發(fā)現(xiàn)此時 dynamic weight 的 slice 信息已經(jīng)和普通 weight 完全相同:

24c4dd7e-6713-11ee-9788-92fbcf53809c.png

F16 和 int8 精度問題

在解決了 F32 的 bug 后,F(xiàn)16 和 int8 的 tpu 層 mlir 仍然存在精度問題。原本以為是 DeConv 的 F16 適配存在問題,通過使用 mlir_debugger 對每一層用正確數(shù)值做推理(也可以直接觀察輸出的 npz 文件以及 npz_tool 的比對結果),發(fā)現(xiàn)出錯的是 Active -> Mul 的結構,Active 是 ReduceSum 操作:

24e5685a-6713-11ee-9788-92fbcf53809c.png

因此基本可以確定是普通的 F16 溢出問題。驗證 BF16,發(fā)現(xiàn)BF16 編譯成功,進一步確認是溢出問題。

將這些層添加到 qtable 中,發(fā)現(xiàn)還是通過不了比對,值里面仍然會存在 inf。對比發(fā)現(xiàn)是在 Active(ReduceSum) -> Sqrt 的結構中間有兩個 Cast 導致的:

24f21456-6713-11ee-9788-92fbcf53809c.png

這兩個 cast 沒有作用,可以被優(yōu)化掉,于是寫圖優(yōu)化將這兩個 Cast 直接消除。優(yōu)化后對應的 mlir 如下:

2504a922-6713-11ee-9788-92fbcf53809c.png

int8 也是相同的精度溢出問題,同樣確認兩個 cast 融合的操作能夠覆蓋 int8 的情況即可。

至此,DragGan 適配的模型部份適配完成。

總結

  • 在一些情況下,在不影響結果的情況下直接修改模型的代碼結構可以更容易的解決一些算子適配問題
  • 較大的模型測試錯誤定位到具體算子的情況下,優(yōu)先考慮構建單側嘗試復現(xiàn)問題
  • 控制變量,設置對照,是缺少解決思路時尋找問題的一個較為通用的方案。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 人工智能
    +關注

    關注

    1821

    文章

    50373

    瀏覽量

    267082
  • GaN
    GaN
    +關注

    關注

    21

    文章

    2386

    瀏覽量

    84680
  • 模型
    +關注

    關注

    1

    文章

    3834

    瀏覽量

    52289
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    昆侖芯科技完成商湯日日新SenseNova U1系列大模型極速適配

    近日,商湯正式發(fā)布并開源原生理解生成統(tǒng)一模型——商湯日日新SenseNova U1系列。在模型發(fā)布當日,昆侖芯即完成對SenseNova U1的極速適配,成為率先完成該模型
    的頭像 發(fā)表于 05-06 10:55 ?364次閱讀

    昆侖芯科技完成小米MiMo-V2.5-Pro大模型極速適配

    小米正式發(fā)布并開源MiMo-V2.5-Pro模型。昆侖芯在發(fā)布當日即完成對MiMo-V2.5-Pro的極速適配,成為首批實現(xiàn)適配的國產(chǎn)算力廠商之一,再次驗證其在主流大模型生態(tài)中的敏捷響
    的頭像 發(fā)表于 05-06 10:53 ?374次閱讀

    開放原子AtomGit平臺首發(fā)適配DeepSeek-V4系列模型

    2026年4月24日,DeepSeek-V4系列模型正式發(fā)布并同步開源。AtomGit平臺為DeepSeek-V4昇騰適配版本首發(fā)平臺,為開發(fā)者提供從模型獲取、算力適配到工程部署的一站
    的頭像 發(fā)表于 04-29 16:12 ?747次閱讀

    昆侖芯科技完成MiniMax M2.7模型極速適配

    今日,MiniMax正式開源MiniMax M2.7模型。昆侖芯同步完成對該模型的Day 0適配與深度優(yōu)化,成為首批實現(xiàn)適配的國產(chǎn)算力廠商之一,再次驗證其在主流大
    的頭像 發(fā)表于 04-13 17:07 ?529次閱讀

    海光DCU完成Qwen3.5多模態(tài)MoE模型全量適配

    近日,海光DCU完成Qwen3.5-397B MoE旗艦多模態(tài)模型、Qwen3.5-35B-A3B MoE多模態(tài)模型全量適配、精度對齊與推理部署驗證。本次適配依托FlagOS專屬vLL
    的頭像 發(fā)表于 03-26 09:35 ?780次閱讀

    沐曦曦云C600 GPU產(chǎn)品適配階躍星辰基座模型Step 3.5 Flash

    今天,階躍星辰技術團隊發(fā)布并開源最新旗艦基座模型 Step 3.5 Flash。沐曦股份已實現(xiàn)曦云C600與該模型深度協(xié)同適配,為國內首先完成與該模型Day 0
    的頭像 發(fā)表于 02-02 14:44 ?568次閱讀
    沐曦曦云C600 GPU產(chǎn)品<b class='flag-5'>適配</b>階躍星辰基座<b class='flag-5'>模型</b>Step 3.5 Flash

    AI芯片大單!Anthropic從博通采購100萬顆TPU v7p芯片

    電子發(fā)燒友網(wǎng)報道(文/李彎彎)近日消息,AI企業(yè)Anthropic將直接從博通采購近100萬顆TPU v7?pIronwood AI芯片,本地部署在其控制的數(shù)據(jù)中心中。也就是說,博通將直接
    的頭像 發(fā)表于 01-06 08:38 ?1.1w次閱讀

    新品 | 成電子XC3576M小體積主板,全面適配國產(chǎn)麒麟操作系統(tǒng)

    在工業(yè)自動化與智能制造高速發(fā)展的今天,核心硬件的自主可控已成為國家戰(zhàn)略與產(chǎn)業(yè)升級的關鍵。成電子隆重推出XC3576M工控主板——專為國產(chǎn)操作系統(tǒng)優(yōu)化的小體積高性能解決方案,以卓越性能與全面國產(chǎn)化
    的頭像 發(fā)表于 12-19 14:07 ?804次閱讀
    新品 | <b class='flag-5'>向</b>成電子XC3576M小體積主板,全面<b class='flag-5'>適配</b>國產(chǎn)麒麟<b class='flag-5'>操作</b>系統(tǒng)

    愛芯元智邊緣AI芯片AX8850完成CosyVoice2大模型適配

    今年下半年,隨著業(yè)務推廣需求增加,我們的大模型適配工作也有了新方向:不再只追求前沿模型的快速適配,而是更聚焦為銷售團隊提供“能打”的實戰(zhàn)“彈藥”——也就是貼近客戶剛需的、可快速落地的大
    的頭像 發(fā)表于 12-11 10:35 ?5613次閱讀
    愛芯元智邊緣AI芯片AX8850完成CosyVoice2大<b class='flag-5'>模型</b><b class='flag-5'>適配</b>

    谷歌云發(fā)布最強自研TPU,性能比前代提升4倍

    精心設計,能夠輕松處理從大型模型訓練到實時聊天機器人運行以及AI智能體操作等各類復雜任務。 ? 谷歌在新聞稿中著重強調,“Ironwood”是專為應對最嚴苛的工作負載而打造的。無論是大規(guī)模模型訓練、復雜的強化學習(RL),還是高
    的頭像 發(fā)表于 11-13 07:49 ?9061次閱讀
    谷歌云發(fā)布最強自研<b class='flag-5'>TPU</b>,性能比前代提升4倍

    澎峰科技完成OpenAI最新開源推理模型適配

    澎峰科技現(xiàn)已完成 OpenAI 最新開源推理模型 gpt-oss-20b 在 DeepFusion 大模型一體機上的原生適配與優(yōu)化,用戶可一鍵啟用這顆“小而強悍”的新引擎,在本地享受企業(yè)級 AI 生產(chǎn)力!
    的頭像 發(fā)表于 08-14 11:34 ?1591次閱讀

    華為CANN與智譜GLM端側模型完成適配

    已于7月28日正式開源其新一代基座模型GLM-4.5,其GLM端側模型已完成與CANN的適配。這標志著國產(chǎn)大模型與計算架構在端云協(xié)同方向實現(xiàn)關鍵突破,國產(chǎn)AI生態(tài)正加速邁入深度融合階段
    的頭像 發(fā)表于 08-11 11:00 ?2812次閱讀

    硬件與應用同頻共振,英特爾Day 0適配騰訊開源混元大模型

    于OpenVINO? 構建的 AI 軟件平臺的可擴展性,英特爾助力ISV生態(tài)伙伴率先實現(xiàn)應用端Day 0 模型適配,大幅加速了新模型的落地進程,彰顯了 “硬件 + 模型 + 生態(tài)” 協(xié)
    的頭像 發(fā)表于 08-07 14:42 ?1564次閱讀
    硬件與應用同頻共振,英特爾Day 0<b class='flag-5'>適配</b>騰訊開源混元大<b class='flag-5'>模型</b>

    壁仞科技完成Qwen3旗艦模型適配

    近日,在高效適配Qwen3系列模型推理后,壁仞科技宣布完成旗艦版Qwen3-235B-A22B模型的訓練適配和優(yōu)化。由此,壁仞科技已實現(xiàn)Qwen3系列
    的頭像 發(fā)表于 05-16 16:23 ?1209次閱讀

    摩爾線程MTT S4000完成DeepSeek R1-671B大模型適配驗證

    我國人工智能技術產(chǎn)業(yè)近來取得顯著進步,多款新發(fā)布的大模型已達到國際先進水平。我國AI芯片企業(yè)也在積極行動,和各國產(chǎn)大模型開展適配,共同構建智能計算產(chǎn)業(yè)生態(tài)。作為國家權威技術驗證平臺,中國信息通信
    的頭像 發(fā)表于 05-10 09:49 ?1509次閱讀
    泰和县| 宝鸡市| 宁南县| 吴江市| 滨海县| 米脂县| 霍城县| 准格尔旗| 灵山县| 镇平县| 尤溪县| 隆昌县| 长武县| 乐至县| 元谋县| 永城市| 团风县| 乌兰察布市| 宝清县| 灵石县| 东兰县| 大同县| 尉氏县| 百色市| 浙江省| 南澳县| 普安县| 宣武区| 师宗县| 玉树县| 陵川县| 宣汉县| 鸡东县| 武安市| 翼城县| 西昌市| 会宁县| 马边| 建湖县| 准格尔旗| 固始县|