熱門資訊> 正文
2025-09-29 10:07
1 前言
大家已經很熟悉KG的建構和GNN模型的訓練工作了。一旦訓練好了GNN模型,接着進入模型的部署和運行(推理)階段了。首先,來介紹一項熱門的部署模式,就是:BYOM(Bring Your Own Model)。這BYOM(自帶模型)的涵意,即是:把您自己訓練好的模型,帶到最接近數據、最貼近用户的地方、並展現最佳推理效能。
本文就藉由高通(Qualcomm)公司的AI Hub平臺來示範BYOM流程,説明如何把簡單的RNN模型傳送到AI Hub雲端平臺,並提供目標裝置(如高通的Snapdragon X Elite)型號,讓AI Hub自動轉換與優化,且在真機上量測。然后,下載可部署&運行模型檔案,實際部署到您的目標裝置上運行。
2 細説BYOM流程
簡而言之,BYOM就是:把你訓練好的模型,真的帶到目標裝置上運行起來。其流程很簡單,如下述:
第1步:選定目標裝置。
第2步:您練好的模型匯成ONNX格式。
第3步:將ONNX檔案傳到Qualcomm AI Hub平臺上,並選擇目標裝置(像Snapdragon X Elite),這平臺會將它進行轉換&量化,並且產出(優化ONNX),並在真機上進行實測。然后把產物(即優化ONNX)下載回來。
第4步:把優化ONNX實際部署到目標裝置上運行(推論)了。
這BYOM模式有個重要特性,就是:同一條流程、同一台計算機,模型可以「重複利用」在不同場域,創造連續的價值。例如,有兩個情境:
● 情境-1:在醫療臨牀上,會關心像長期輸血患者的血鐵沉積趨勢。於是就可以收集醫療數據來訓練RNN時序模型,訓練完成后會出ONNX,然后傳送到AI Hub上做轉換而產出醫療的最佳化ONNX,且把它部署到目標裝置上運行。
● 情境-2:在醫療機構的前臺營運方面。大家可能沒想到,各據點櫃檯POS 的交易時序數據,也能訓練RNN模型來做銷售預測、尖離峰判斷,進而排人力班表。於是,就可以收集交易時序數據來訓練RNN時序模型,訓練完成后會出ONNX,然后傳送到AI Hub上做轉換,來產出營運的最佳化ONNX,且把它部署到(同一台)目標裝置上運行。
這呈現了美好的可複用(Reusability)效果:同一台計算機、同一套執行環境,就能在上午跑〈醫療輸血風險趨勢〉,下午跑〈櫃檯銷售預測&人力安排〉。其具有很大的商業意義,如下:
● 一機多模:同一台目標裝置,能切換不同RNN權重,覆蓋醫療教學與長照營運兩種任務。
● 一套流程,多個項目:從ONNX匯出到本地端NPU運行,同一套流程,其訓練流程、評估方法、部署技巧等,都適用於多個不同項目(只要換數據與權重)。
● 邊緣就緒,隱私內建:諸如醫療、營運、或更多領域的數據都能在機器上處理,減少上雲端的成本和風險。
於是,只需把模型做對一次,讓它在更多場景重複創造價值;同一台目標裝置,就能成為您把AI 變成日常工具的起點。同一個目標執行環境,只要替換權重與輸入數據,醫療預測、康養營運都能運行,這種可複用性,正是未來在醫療機構、康養等各單位,把AI 做成低成本、又可持續業務的核心要素。
3 BYOM流程範例:以KG+GIN模型為例
現在,以大家都很熟悉的五行相生相剋關係為例。
如下圖:
於是,從行業知識的角度,將整體流程分為兩個階段:
階段-A:上游KG+GIN,掌握行業知識現在,就撰寫一個簡單Python 程序,來建立一個異質性KG,表達上圖的行業知識。並且建立一個GIN模型來學習KG,而輸出KG 的節點嵌入(Node Embedding)。代碼如下:
# Example_001.py
#...................
folder = 「c:/ox_five_element/」
my_dictionary = ‘{ 金’: 0,‘ 木’: 1,‘ 水’: 2,‘ 火’:3, ‘土’: 4}
edge_dict = {‘( element’, ‘generation’, ‘element’):(torch.tensor([0, 1, 2, 3, 4]), torch.tensor([2,3, 1, 4, 0])),
(‘element’, ‘restraint’, ‘element’):(torch.tensor([0, 1, 2, 3, 4]), torch.tensor([1,4, 3, 0, 2]))
}
# === 建立異質圖 ===
hg = dgl.heterograph(edge_dict)
#...................
class HeteroGIN(nn.Module):def __init__(self, hidden_dim, feat_dict):super().__init__()self.feat_dict = nn.ParameterDict({ k:nn.Parameter(v) for k, v in feat_dict.items() })
self.layer1 = build_hetero_gin(hidden_dim)
self.layer2 = build_hetero_gin(hidden_dim)
def forward(self, g):
h = self.layer1(g, self.feat_dict)
h = {k: F.relu(v) for k, v in h.items()}
h = self.layer2(g, h)return {k: F.normalize(v, dim=1) for k, v in h.items()}
#...................
# End
接着,就把GIN產生的節點嵌入,提供給下游的各項應用任務。下游任務的建構時,並不需要具備上圖的行業知識的推理過程,只憑這些節點嵌入,就能推論出相生和相剋關係。因而實現了:< 不知(行業知識)而亦能用> 的美好效果。
階段-B:下游任務
基於上游階段-A所提供的節點嵌入,各項下游任務都能輕易地運用上游的行業知識。例如,有一個下游任務(Task-aa)需要使用到五行的相生關係,就可以建立一個分類器模型,如下:
# Example_002.py
#.................
class FiveGenModel(nn.Module):def __init__(self, input_dim: int, hidden_dim: int,output_dim: int):
super().__init__()
self.gen = nn.Linear(input_dim, hidden_dim,bias=True)
self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x: torch.Tensor) -> torch.Tensor:
x = self.gen(x)
out = self.fc(x)
return out
X, node_ids = load_embeddings(EMB_CSV)
y = torch.tensor([2, 3, 1, 4, 0])
# 進行訓練
#.................
onnx_file = 「C:/ox/FiveGen_model.onnx」
dummy_input = torch.randn(1, input_dim)
torch.onnx.export( model, dummy_input, onnx_file,i n p u t _ n a m e s = [ 「 i n p u t 」 ] , o u t p u t _names=[「output」], opset_version=17,
)
#.................
# End
其中的load_embeddings() 函數,先讀取上游產出的節點嵌入,來加速訓練這個下游任務里的FiveGenModel模型。訓練好了,就匯出FiveGen_model.onnx 模型檔案。
您就可以輸入五行的某個元素(如< 金>),它就會輸出相生的元素(如< 水>)。
接下來,就進入高通AI Hub 的BYOM 流程了。就來撰寫一支簡單Python 程序:
# Example_003.py
#.................
import qai_hub as hub compile_job, quant_job = hub.submit_compile_and_quantize_jobs(model=」C:/ox/FiveGen_model.onnx」,device=」Snapdragon X Elite CRD」,input_specs={args.input_name: (INPUT_SHAPE, 「float32」)},calibration_data={args.input_name: calib},weights_dtype=hub.QuantizeDtype.INT8,activations_dtype=hub.QuantizeDtype.INT8,
)
#.................
q_target_model = quant_job.get_target_model()if q_target_model is not None:qdq_path = 「C:/ox/fiveGen_quantized_qdq.onnx」
q_target_model.download(qdq_path.as_posix())
#.................
#END
此程序設定了目標裝置是:」Snapdragon X EliteCRD」,然后把FiveGen_model.onnx 上傳到AI Hub 平臺,進行優化完成之后,回傳優化的fiveGen_quantized_qdq.onnx模型。
最后,進入本地實機部署&運行階段。高通AIHub的BYOM流程了。就來撰寫一支簡單Python 程序:
# Example_004..py
import onnxruntime as ort
#...................
id2name = {0: 「金」, 1: 「木」, 2: 「水」, 3: 「火」,4: 「土」}
so = SessionOptions()sess = ort.InferenceSession(model_path,sess_options=so,providers=[「QNNExecutionProvider」,「CPUExecutionProvider」],provider_options = [「{ backend_type」: 「htp」}, {}])
X, node_ids = load_embeddings(EMB_CSV)
x = X[0].unsqueeze(0) # (1, D)
x = x.detach().numpy()
in_name = sess.get_inputs()[0].name
out_name = sess.get_outputs()[0].name
z = sess.run([out_name], {in_name: x})[0] # shape(1,1)pred = np.argmax(z)print(f」{node_id}({id2name.get(node_id,’?’)}) ---生 ---> {pred}({id2name.get(pred,’?’)})」)
#...................
# End
執行時,輸出:0(金)--- 生--- > 2(水)
得到正確答案。如果模型複雜一些,更能展現其優化的運行加速效益。
4 結束語
本文以上游行業KG為語境支撐層,搭配GIN推論模型,來支持下游各項任務的連接數據、語義與實際推論應用。此一設計可以密切結合下游模型的BYOM流程,強力幫忙打通行業語境這一關,並能直接延伸至多個產業領域進行商業化實踐。