Wonnx:在Rust的WebGPU上运行ONNX机器学习模型

2022-02-26 04:40:54

Wonnx是一款GPU加速的ONNX推理运行时软件,100%用Rust编写,可用于网络。

✅ = 一流的支持-🆗 = 全力支持-🚧 = 不支持,但正在进行支持

确保Git LFS已初始化并下载了模型文件(在wonnx/examples/data/models中)。然后,你';一切都准备好了!您可以运行一个示例:

货物运输——放行——信息/数据/模型/选择压缩。MNIST货物运行——释放——推断/数据/模型/选择压缩。onnx-i数据=/数据/图像/鹈鹕。jpeg——标签/数据/模型/挤压标签。txt——前三名

从wonnx导入PySession session=PySession。来自路径(";./data/models/single#relu.onnx";)输入={";x";:[-1.0,2.0]}断言会话。运行(输入)={";y";:[0.0,2.0]}

fn main()->;HashMap<;字符串,Vec<;f32>>;{let mut input_data=HashMap::new();let image=load_squezenet_image();//load image input_data.insert(";data";.to_string(),inputensor::F32(image.as#slice().unwrap());let session=pollster::block#on(wonnx::session::from#path(";examples/data/models/opt squence/opt squence.onnx())。预期(";会话没有创建";);让result=pollster::block_on(session.run(input_data))。展开();让结果=结果[";挤压0#u展平0#u重塑0";];让mut概率=结果。iter()。枚举()。收集:<;Vec<_>>;(); 概率。按(|a,b | b.1.部分_cmp(a.1))排序。展开();坚持!(概率[0].0,22);]

WGPU_ADAPTER_名称,带有要使用的适配器名称的子字符串(例如,1080将匹配NVIDIA GeForce 1080ti)。

WGPU_BACKEND,带有逗号分隔的要使用的后端列表(vulkan、metal、dx12、dx11或gl)。

WGPU_POWER_首选项,当特定适配器名称为'时,可选择电源首选项;t规定(高或低)

即使没有在DL、WGSL或Rust方面的丰富经验,也非常欢迎您的贡献。我希望,这个项目可以成为一个沙箱,让我们所有人都能在这个项目最初的范围之外更多地了解这些技术。

设alpha=get_属性(";alpha";,Some(1.0),node);//或者没有默认值,让alpha=get_属性::<;f32>;(";alpha";,无,节点);

可用类型在结构中。wgsl,但也可以在模板中生成新模板。

遵循绑定布局,每个条目从0开始递增1,输入第一,输出最后。如果绑定数量超过4。增加绑定组。您可以在sequencer中更改输入。rs

{{i_lens[0]}:输入0的长度。这也适用于输出:{o_lens[0]}和其他输入{i_lens[1]}

{{i_shape[0]}:输入0的维度数组。要获得数组的第一维,只需使用:{i_shape[0][0]}

{{i_chunks[0]}:输入0的每个维度的块的大小。默认情况下,每个变量都表示为一个长的值数组,要获得特定的值,必须按块移动。这些块在这个变量中表示。要获得第一维度块的大小,请使用:{i_chunks[0][0]}。

{{op_type}op type与某些类似op_类型的激活使用相同的模板。

使用utils函数对其进行测试,并将其放在tests文件夹中。测试可以如下所示:

#[test]fn test_matmul_square_matrix(){//USER INPUT let n=16;let mut INPUT_data=HashMap::new();let data_a=ndarray::Array2::eye(n);let mut data_b=ndarray::Array2:<;f32>;:零((n,n));data_b[[0,0]=0.2;data_b[[0,1]=0(";A";.to_string(),data_A.as_slice()。展开();输入数据。插入(";B";.to_string(),data_B.as_slice()。展开();设n=n为i64;设model=model(图(vec![tensor(";A";,&;[n,n])),tensor(";B";,&;[n,n]),vec![tensor(";C";,&;[n,n])],向量![],维克![],维克![节点(vec![";A";,";B";],维克![C";C";]"马特穆尔""马特穆尔";,维克![])], )); 让session=pollster::block_on(wonnx::session::from_model(model))。expect(";会话没有创建";);让result=pollster::block_on(session.run(input_data))。展开();坚持!(结果[";C";])。作为_slice(),求和。如_slice()。展开();}

如果在任何时候你想对几个节点进行优化,你可以在sequencer中进行。卢比。