{"id":24765939,"url":"https://github.com/infinitensor/infinicanvas","last_synced_at":"2026-05-15T23:10:28.695Z","repository":{"id":220468527,"uuid":"751707637","full_name":"InfiniTensor/InfiniCanvas","owner":"InfiniTensor","description":"模型搭建前端API","archived":false,"fork":false,"pushed_at":"2024-03-14T06:17:37.000Z","size":40,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-23T17:25:48.562Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/InfiniTensor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-02-02T06:34:05.000Z","updated_at":"2024-02-02T07:10:15.000Z","dependencies_parsed_at":"2024-02-06T03:29:21.699Z","dependency_job_id":"e1120f67-0639-4315-8ae9-7b9fd27d829b","html_url":"https://github.com/InfiniTensor/InfiniCanvas","commit_stats":null,"previous_names":["infinitensor/infinicanvas"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/InfiniTensor/InfiniCanvas","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfiniTensor%2FInfiniCanvas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfiniTensor%2FInfiniCanvas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfiniTensor%2FInfiniCanvas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfiniTensor%2FInfiniCanvas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/InfiniTensor","download_url":"https://codeload.github.com/InfiniTensor/InfiniCanvas/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfiniTensor%2FInfiniCanvas/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264578908,"owners_count":23631556,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-28T23:17:48.305Z","updated_at":"2026-05-15T23:10:23.657Z","avatar_url":"https://github.com/InfiniTensor.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# InfiniCanvas构图API\n\n本项目为机器学习模型推理构图前端，提供类PyTorch形式的动态模型搭建API，服务于 [InfiniTensor（重构图）](https://github.com/InfiniTensor/RefactorGraph)后端推理框架，支持导出静态化的onnx计算图。\n\n## 安装\n\n1. 安装 [InfiniTensor（重构图）](https://github.com/InfiniTensor/RefactorGraph)后端推理框架\n2. 使用 `make` 安装本项目\n\n## 使用说明\n\n### 模型搭建\n\n#### 1. InfiniTensorModel\n\n本项目中的模型均继承自 `InfiniTensorModel` 基类（用法类似PyTorch中的 `nn.Module`）。\n\n#### 2. 模型构造\n\n在 `__init__()` 函数中定义该模型的各类参数，以及子模块。\n\n其中常量使用 `self.constant` 创建；模型参数（可导入导出）使用 `self.parameter` 创建。使用 `self.make_submodel(ModelClassName, ...)` 可在模型中创建子模型（同为`InfiniTensorModel` 的子类）。需要注意的是，子模型创建必须在 `__init__()` 函数中且必须使用 `self.make_submodel` 函数创建，这个函数会隐式调用子模型类的构造函数。这是因为模型与子模型需要共享一套命名空间，且在构造外围模型时子模型必须先完成构建。\n\n定义 `__init__()` 函数时，必须传入 `**kwargs` 参数，必须调用 `super().__init__(**kwargs)`。\n\n#### 3. 计算图构造\n\n在 `forward()` 函数中定义该模型推理时的计算图，所有`InfiniTensorModel` 子类必须定义这个函数。与PyTorch的 `forward()` 函数不同的是，这里的 `forward()` 函数并不会发生任何计算，而只是用来构建计算图，因此传进来的参数是代表张量的张量名称（字符串）。\n\n 在 `forward()` 函数中，有两种方式在计算图中增加节点：\n\n 1. `InfiniTensorModel` 基类提供的一系列算子API，如 `self.add` 等。\n\n 2. 调用初始化时构建的子模型的  `__call__()`（或`forward()`） 函数，代表将子模块加入计算图。在调用`__call__()` 函数时，`forward()`会被隐式调用，传进来的输入以及模型的输出应该分别被添加至 `self.inputs` 和 `self.outputs` 中。原则上，一个模型包括其子模型的 `forward()` 函数只可被调用一次。\n\n以下为一个语言模型常用的FeedFoward层的定义。\n\n```python\nclass Linear(InfiniTensorModel):\n    def __init__(\n        self,\n        in_features: int,\n        out_features: int,\n        bias: bool = True,\n        dtype: DTYPE = DTYPE.F32,\n        **kwargs,\n    ):\n        super().__init__(**kwargs)\n        shape = (out_features, in_features)\n        # 创建参数张量\n        self.weight = self.parameter(\n            (np.random.random(shape)).astype(dtype.np_type()), \"weight\"\n        )\n        self.use_bias = bias\n        if self.use_bias:\n            self.bias = self.parameter(\n                np.random.random(out_features).astype(dtype.np_type()), \"bias\"\n            )\n\n    def forward(self, input):\n        output = self.matmul(input, self.weight, transB=1)\n        if self.use_bias:\n            output = self.add(output, self.bias)\n        return output\n\nclass FeedForward(InfiniTensorModel):\n    def __init__(self, hidden_size, intermediate_size, dtype=DTYPE.F32, **kwargs):\n        # 调用基类的构造函数\n        super().__init__(**kwargs)\n        self.hidden_size = hidden_size\n        self.intermediate_size = intermediate_size\n        self.dtype = dtype\n        # 创建一个Linear层（子模型）\n        self.gate_proj = self.make_submodel(\n            Linear, self.hidden_size, self.intermediate_size, False, dtype, model_name = \"gate_proj\"\n        )\n        self.up_proj = self.make_submodel(\n            Linear, self.hidden_size, self.intermediate_size, False, dtype, model_name = \"up_proj\"\n        )\n        self.down_proj = self.make_submodel(\n            Linear, self.intermediate_size, self.hidden_size, False, dtype, model_name = \"down_proj\"\n        )\n        self.act_fn = self.silu\n\n    def forward(self, x):\n        output = self.down_proj(\n            self.mul(self.act_fn(self.gate_proj(x)), self.up_proj(x))\n        )\n        return output\n```\n\n### 推理\n\n在进行实际计算之前，应该首先调用模型的 `__call__()` 函数构建计算图。之后，调用 `run()` 函数使用后端推理框架进行推理。需要注意的是，如果在模型中使用了 `self.dynamic_tensor` 创建的动态张量，则推理时必须传入相应的变量表对变量进行转换。如果进行多轮推理且张量形状保持不变，则只需第一轮推理时传入变量表，或者可以将重编译选项关闭。\n\n```python\n# 创建模型\nmodel = MyModel(...)\n# 将模型运行时设备设置为GPU\nmodel.to(\"cuda\", 0)\n# 导入参数\nmodel.load_params(...)\n# 调用__call__()函数构图\nmodel([\"input1\", \"input2\"]) \n# 输入\ninputs = {\n    \"input1\": np.array(...),\n    \"input2\": np.array(...),\n}\n# 变量表\nvariable_map = {\n    \"batchsize\": 32\n}\n# 推理\noutputs = model.run(inputs, variable_map)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfinitensor%2Finfinicanvas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finfinitensor%2Finfinicanvas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfinitensor%2Finfinicanvas/lists"}