mirror of
https://github.com/tinygrad/tinygrad.git
synced 2026-01-09 15:08:02 -05:00
* boom * fix webgpu * use exact variable names in test so that AI can read easier * add tag for specific test name like test a specific dtype * fix ruff * astype everything * dtype in array creation * just arange * is 67% considered fixed? * move test up * small cleanups * share function * add qgemm as well * add qgemm too * make sure qgemm comes out as int * take out qgemm for now * fixed test * add correct qgemm * addressing feedback here too, early naive fix for now * simplify bias and c to be minimalistic enough to test correctness * refactored qlinearops * maybe these asserts aren't the best.. * fix test * updated tests to cover new ops * try to add to CI * move test_onnx_ops into testextra/ * more attention tests * qlinear_add atol=1 * attention still not fullllllly correct * it is what it is --------- Co-authored-by: chenyu <chenyu@fastmail.com>
34 lines
1.4 KiB
Python
34 lines
1.4 KiB
Python
from tinygrad import Tensor
|
|
from tinygrad.tensor import _to_np_dtype
|
|
from extra.onnx import OnnxRunner, OnnxValue
|
|
import onnx
|
|
import numpy as np
|
|
import onnxruntime as ort
|
|
|
|
def get_example_inputs(graph_inputs:dict[str, OnnxValue]):
|
|
ret: dict[str, Tensor] = {}
|
|
for name, spec in graph_inputs.items():
|
|
assert not spec.is_optional and not spec.is_sequence, "only allow tensor input for now"
|
|
shape = tuple(dim if isinstance(dim, int) else 1 for dim in spec.shape)
|
|
value = Tensor(np.random.uniform(size=shape).astype(_to_np_dtype(spec.dtype)) * 8).realize()
|
|
ret.update({name:value})
|
|
return ret
|
|
|
|
def validate(onnx_file, inputs, rtol=1e-5, atol=1e-5):
|
|
run_onnx = OnnxRunner(onnx.load(onnx_file))
|
|
|
|
ort_options = ort.SessionOptions()
|
|
ort_options.log_severity_level = 3
|
|
ort_sess = ort.InferenceSession(onnx_file, ort_options, ["CPUExecutionProvider"])
|
|
np_inputs = {k:v.numpy() if isinstance(v, Tensor) else v for k,v in inputs.items()}
|
|
out_names = list(run_onnx.graph_outputs)
|
|
out_values = ort_sess.run(out_names, np_inputs)
|
|
ort_out = dict(zip(out_names, out_values))
|
|
|
|
tinygrad_out = run_onnx(inputs)
|
|
|
|
assert tinygrad_out.keys() == ort_out.keys()
|
|
for k in tinygrad_out.keys():
|
|
tiny_v, onnx_v = tinygrad_out[k], ort_out[k]
|
|
if tiny_v is None: assert onnx_v is None, f"{k}: {tiny_v=}, {onnx_v=}"
|
|
else: np.testing.assert_allclose(tiny_v.numpy(), onnx_v, rtol=rtol, atol=atol, err_msg=f"For tensor '{k}' in {tinygrad_out.keys()}") |