Skip to content
Snippets Groups Projects
Commit 0ecc55fc authored by Yifan Zhao's avatar Yifan Zhao
Browse files

Fixed some bug and passed frontend -> binary test

parent 756c0ff9
No related branches found
No related tags found
No related merge requests found
...@@ -63,7 +63,7 @@ class ModelExporter: ...@@ -63,7 +63,7 @@ class ModelExporter:
self.weight_dir.mkdir(exist_ok=True) self.weight_dir.mkdir(exist_ok=True)
flavor = HpvmCodeGen if hpvmc else TensorCodeGen flavor = HpvmCodeGen if hpvmc else TensorCodeGen
self.codegen = flavor(self.dfg, output_dir, self.dataset_size) self.codegen = flavor(self.dfg, self.weight_dir, self.dataset_size)
def export_source_code(self, output: PathLike, batch_size: Optional[int] = None): def export_source_code(self, output: PathLike, batch_size: Optional[int] = None):
self.codegen.compile(output, batch_size) self.codegen.compile(output, batch_size)
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#include <hpvm.h> #include <hpvm.h>
#include <tensorTypes.h> #include <tensorTypes.h>
#include <tensorUtils.h> #include <tensorUtils.h>
#include <config.h>
{% for node in nodes %} {% for node in nodes %}
void var_{{node.idx}}_node( void var_{{node.idx}}_node(
...@@ -22,7 +21,7 @@ t{{n}}{{", " if not loop.last}} ...@@ -22,7 +21,7 @@ t{{n}}{{", " if not loop.last}}
{% endfor -%} {% endfor -%}
void root(void *__output, {%- for n in root_inputs -%} void root({%- for n in root_inputs -%}
void *{{n}}, size_t {{n}}_bytes{{", " if not loop.last}} void *{{n}}, size_t {{n}}_bytes{{", " if not loop.last}}
{%- endfor %}) { {%- endfor %}) {
__hpvm__hint(hpvm::CPU_TARGET); __hpvm__hint(hpvm::CPU_TARGET);
...@@ -34,8 +33,8 @@ void *{{n}}, size_t {{n}}_bytes{{", " if not loop.last}} ...@@ -34,8 +33,8 @@ void *{{n}}, size_t {{n}}_bytes{{", " if not loop.last}}
void* var_{{node.idx}} = __hpvm__createNodeND(0, var_{{node.idx}}_node); void* var_{{node.idx}} = __hpvm__createNodeND(0, var_{{node.idx}}_node);
{% for edge in node.edges %} {% for edge in node.edges %}
{% if edge.is_bindin %} {% if edge.is_bindin %}
__hpvm__bindIn(var_{{node.idx}}, {{edge.input_idx * 2 + 1}}, {{edge.edge_idx * 2}}, 0); __hpvm__bindIn(var_{{node.idx}}, {{edge.input_idx * 2}}, {{edge.edge_idx * 2}}, 0);
__hpvm__bindIn(var_{{node.idx}}, {{edge.input_idx * 2 + 2}}, {{edge.edge_idx * 2 + 1}}, 0); __hpvm__bindIn(var_{{node.idx}}, {{edge.input_idx * 2 + 1}}, {{edge.edge_idx * 2 + 1}}, 0);
{% else %} {% else %}
__hpvm__edge(var_{{edge.input_node}}, var_{{node.idx}}, 1, 0, {{edge.edge_idx * 2}}, 0); __hpvm__edge(var_{{edge.input_node}}, var_{{node.idx}}, 1, 0, {{edge.edge_idx * 2}}, 0);
__hpvm__edge(var_{{edge.input_node}}, var_{{node.idx}}, 1, 1, {{edge.edge_idx * 2 + 1}}, 0); __hpvm__edge(var_{{edge.input_node}}, var_{{node.idx}}, 1, 1, {{edge.edge_idx * 2 + 1}}, 0);
...@@ -53,7 +52,6 @@ struct ret_t { ...@@ -53,7 +52,6 @@ struct ret_t {
}; };
typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) {
void *__output;
{% for n in root_inputs %} {% for n in root_inputs %}
void *{{n}}; void *{{n}};
size_t {{n}}_bytes; size_t {{n}}_bytes;
...@@ -64,10 +62,20 @@ typedef struct __attribute__((__packed__)) { ...@@ -64,10 +62,20 @@ typedef struct __attribute__((__packed__)) {
const int batch_size = {{batch_size}}, input_size = {{input_size}}, batch_count = input_size / batch_size; const int batch_size = {{batch_size}}, input_size = {{input_size}}, batch_count = input_size / batch_size;
int main(){ int main(int argc, char *argv[]){
if (argc != 2) {
std::cout << "Usage: " << argv[0] << " {tune|test}\n";
return 1;
}
std::string arg1 = argv[1];
if (arg1 != "tune" && arg1 != "test") {
std::cout << "Usage: " << argv[0] << " {tune|test}\n";
return 1;
}
std::string dir_prefix = "{{prefix}}/"; std::string dir_prefix = "{{prefix}}/";
std::string input_path = dir_prefix + "input.bin"; std::string input_path = dir_prefix + arg1 + "_input.bin";
std::string labels_path = dir_prefix + "labels32.bin"; std::string labels_path = dir_prefix + arg1 + "_labels.bin";
{% for w in weights %} {% for w in weights %}
std::string {{w.name}}_path = dir_prefix + "{{w.filename}}"; std::string {{w.name}}_path = dir_prefix + "{{w.filename}}";
void* {{w.name}} = readTrainedWeights({{w.name}}_path.c_str(), 0, {{w.shape|join(', ')}}); void* {{w.name}} = readTrainedWeights({{w.name}}_path.c_str(), 0, {{w.shape|join(', ')}});
...@@ -88,7 +96,7 @@ int main(){ ...@@ -88,7 +96,7 @@ int main(){
void* dfg = __hpvm__launch(0, root, (void*) args); void* dfg = __hpvm__launch(0, root, (void*) args);
__hpvm__wait(dfg); __hpvm__wait(dfg);
void *result = static_cast<RootIn*>(args)->__output; void *result = static_cast<RootIn*>(args)->r.tensor;
hpvm_request_tensor(result, 0); hpvm_request_tensor(result, 0);
uint32_t* labels = readLabelsBatch3(labels_path.c_str(), start, end); uint32_t* labels = readLabelsBatch3(labels_path.c_str(), start, end);
......
...@@ -7,13 +7,23 @@ ...@@ -7,13 +7,23 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include "../../tensor_runtime/include/tensor_runtime.h" #include "tensor_runtime.h"
#include "../include/utils.h" #include "utils.h"
int main() { int main(int argc, char *argv[]){
std::string dir_prefix = "{{prefix}}"; if (argc != 2) {
std::string input_path = dir_prefix + "input.bin"; std::cout << "Usage: " << argv[0] << " {tune|test}\n";
std::string labels_path = dir_prefix + "labels.bin"; return 1;
}
std::string arg1 = argv[1];
if (arg1 != "tune" && arg1 != "test") {
std::cout << "Usage: " << argv[0] << " {tune|test}\n";
return 1;
}
std::string dir_prefix = "{{prefix}}/";
std::string input_path = dir_prefix + arg1 + "_input.bin";
std::string labels_path = dir_prefix + arg1 + "_labels.bin";
{% for w in weights %} {% for w in weights %}
std::string {{w.name}}_path = dir_prefix + std::string("{{w.filename}}"); std::string {{w.name}}_path = dir_prefix + std::string("{{w.filename}}");
void* {{w.name}} = readTrainedWeights({{w.name}}_path.c_str(), 0, {{w.shape|join(', ')}}); void* {{w.name}} = readTrainedWeights({{w.name}}_path.c_str(), 0, {{w.shape|join(', ')}});
......
import os import os
import shutil
import site import site
from pathlib import Path from pathlib import Path
import shutil from subprocess import run
import torch
from torch2hpvm import BinDataset, ModelExporter from torch2hpvm import BinDataset, ModelExporter
from torch.nn import Module
site.addsitedir(os.path.dirname(__file__)) site.addsitedir(os.path.dirname(__file__))
import dnn import dnn
benchmarks = [ benchmarks = [
(dnn.LeNet, 1, 28, "lenet_mnist"), (dnn.LeNet, 1, 28, 5000, "lenet_mnist"),
(dnn.AlexNet, 3, 32, "alexnet_cifar10"), (dnn.AlexNet, 3, 32, 5000, "alexnet_cifar10"),
(dnn.AlexNet2, 3, 32, "alexnet2_cifar10"), (dnn.AlexNet2, 3, 32, 5000, "alexnet2_cifar10"),
(dnn.AlexNetImageNet, 3, 224, "alexnet_imagenet"), (dnn.AlexNetImageNet, 3, 224, 500, "alexnet_imagenet"),
(dnn.MobileNet, 3, 32, "mobilenet_cifar10"), (dnn.MobileNet, 3, 32, 5000, "mobilenet_cifar10"),
(dnn.ResNet18, 3, 32, "resnet18_cifar10"), (dnn.ResNet18, 3, 32, 5000, "resnet18_cifar10"),
(dnn.ResNet50, 3, 224, "resnet50_imagenet"), (dnn.ResNet50, 3, 224, 100, "resnet50_imagenet"),
(dnn.VGG16Cifar10, 3, 32, "vgg16_cifar10"), (dnn.VGG16Cifar10, 3, 32, 5000, "vgg16_cifar10"),
(dnn.VGG16Cifar100, 3, 32, "vgg16_cifar100"), (dnn.VGG16Cifar100, 3, 32, 5000, "vgg16_cifar100"),
(dnn.VGG16ImageNet, 3, 224, "vgg16_imagenet"), (dnn.VGG16ImageNet, 3, 224, 100, "vgg16_imagenet"),
] ]
self_folder = Path(__file__).parent self_folder = Path(__file__).parent
for model_cls, nch, img_size, pathname in benchmarks: for model_cls, nch, img_size, batch_size, pathname in benchmarks:
target = Path(f"/tmp/{pathname}") codegen_dir = Path(f"/tmp/{pathname}")
print(f"Generating {pathname} to {target}") print(f"Generating {pathname} to {codegen_dir}")
if target.exists(): if codegen_dir.exists():
shutil.rmtree(target) shutil.rmtree(codegen_dir)
prefix = self_folder / "../model_params" / pathname prefix = self_folder / "../model_params" / pathname
dataset_shape = 5000, nch, img_size, img_size dataset_shape = 5000, nch, img_size, img_size
bin_tuneset = BinDataset( bin_tuneset = BinDataset(
...@@ -34,4 +37,16 @@ for model_cls, nch, img_size, pathname in benchmarks: ...@@ -34,4 +37,16 @@ for model_cls, nch, img_size, pathname in benchmarks:
bin_testset = BinDataset( bin_testset = BinDataset(
prefix / "test_input.bin", prefix / "test_labels.bin", dataset_shape prefix / "test_input.bin", prefix / "test_labels.bin", dataset_shape
) )
ModelExporter(model_cls(), bin_tuneset, bin_testset, target, True).export_all() model: Module = model_cls()
checkpoint = self_folder / "../model_params" / f"{pathname}.pth.tar"
model.load_state_dict(torch.load(checkpoint.as_posix()))
exporter = ModelExporter(model, bin_tuneset, bin_testset, codegen_dir, True)
exporter.export_all(batch_size=batch_size)
build_dir = codegen_dir / "build"
target_binary = build_dir / pathname
run([
"approxhpvm.py", str(codegen_dir / ModelExporter.source_file_name), str(target_binary),
"-d", str(build_dir),
"-t", "cudnn"
], check=True)
run([str(target_binary), "test"], check=True)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment