热门资讯> 正文
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流程,强力帮忙打通行业语境这一关,并能直接延伸至多个产业领域进行商业化实践。