onnx_diagnostic.ext_test_case¶
The module contains the main class ExtTestCase
which adds
specific functionalities to this project.
- class onnx_diagnostic.ext_test_case.ExtTestCase(methodName='runTest')[source]¶
Inherits from
unittest.TestCase
and adds specific comprison functions and other helper.- assertAlmostEqual(expected: ndarray, value: ndarray, atol: float = 0, rtol: float = 0)[source]¶
In the name
- assertEqual(expected: Any, value: Any, msg: str = '')[source]¶
Overwrites the error message to get a more explicit message about what is what.
- assertEqualArray(expected: Any, value: Any, atol: float = 0, rtol: float = 0, msg: str | None = None)[source]¶
In the name
- assertEqualArrays(expected: Sequence[ndarray], value: Sequence[ndarray], atol: float = 0, rtol: float = 0, msg: str | None = None)[source]¶
In the name
- assertIn(tofind: str, text: str, msg: str = '')[source]¶
Just like self.assertTrue(a in b), but with a nicer default message.
- assert_onnx_disc(test_name: str, proto: onnx.ModelProto, model: torch.nn.Module, inputs: Tuple[Any] | Dict[str, Any], verbose: int = 0, atol: float = 1e-05, rtol: float = 0.001, copy_inputs: bool = True, expected: Any | None = None, use_ort: bool = False, **kwargs)[source]¶
Checks for discrepancies. Runs the onnx models, computes expected outputs, in that order. The inputs may be modified by this functions if the torch model modifies them inplace.
- Parameters:
test_name – test name, dumps the model if not empty
proto – onnx model
model – torch model
inputs – inputs
verbose – verbosity
atol – absolute tolerance
rtol – relative tolerance
expected – expected values
copy_inputs – to copy the inputs
use_ort – use
onnxruntime.InferenceSession
kwargs – arguments sent to
onnx_diagnostic.helpers.ort_session.InferenceSessionForTorch
- capture(fct: Callable)[source]¶
Runs a function and capture standard output and error.
- Parameters:
fct – function to run
- Returns:
result of fct, output, error
- get_dump_file(name: str, folder: str | None = None) str [source]¶
Returns a filename to dump a model.
- classmethod setUpClass()[source]¶
Hook method for setting up class fixture before running tests in the class.
- subloop(*args, verbose: int = 0)[source]¶
Loops over elements and calls
unittests.TestCase.subTest()
.
- classmethod tearDownClass()[source]¶
Hook method for deconstructing the class fixture after running all tests in the class.
- tryCall(fct: Callable, msg: str | None = None, none_if: str | None = None) Any | None [source]¶
Calls the function, catch any error.
- Parameters:
fct – function to call
msg – error message to display if failing
none_if – returns None if this substring is found in the error message
- Returns:
output of fct
- onnx_diagnostic.ext_test_case.has_onnxruntime_training(push_back_batch: bool = False)[source]¶
Tells if onnxruntime_training is installed.
- onnx_diagnostic.ext_test_case.has_onnxscript(version: str, msg: str = '') Callable [source]¶
Skips a unit test if onnxscript is not recent enough.
- onnx_diagnostic.ext_test_case.has_torch(version: str) bool [source]¶
Returns True if torch transformers is higher.
- onnx_diagnostic.ext_test_case.has_transformers(version: str) bool [source]¶
Returns True if transformers version is higher.
- onnx_diagnostic.ext_test_case.hide_stdout(f: Callable | None = None) Callable [source]¶
Catches warnings, hides standard output. The function may be disabled by setting
UNHIDE=1
before running the unit test.- Parameters:
f – the function is called with the stdout as an argument
- onnx_diagnostic.ext_test_case.ignore_errors(errors: Exception | Tuple[Exception]) Callable [source]¶
Catches exception, skip the test if the error is expected sometimes.
- Parameters:
errors – errors to ignore
- onnx_diagnostic.ext_test_case.ignore_warnings(warns: List[Warning]) Callable [source]¶
Catches warnings.
- Parameters:
warns – warnings to ignore
- onnx_diagnostic.ext_test_case.is_azure() bool [source]¶
Tells if the job is running on Azure DevOps.
- onnx_diagnostic.ext_test_case.long_test(msg: str = '') Callable [source]¶
Skips a unit test if it runs on azure pipeline on Windows.
- onnx_diagnostic.ext_test_case.measure_time(stmt: str | Callable, context: Dict[str, Any] | None = None, repeat: int = 10, number: int = 50, warmup: int = 1, div_by_number: bool = True, max_time: float | None = None) Dict[str, str | int | float] [source]¶
Measures a statement and returns the results as a dictionary.
- Parameters:
stmt – string or callable
context – variable to know in a dictionary
repeat – average over repeat experiment
number – number of executions in one row
warmup – number of iteration to do before starting the real measurement
div_by_number – divide by the number of executions
max_time – execute the statement until the total goes beyond this time (approximately), repeat is ignored, div_by_number must be set to True
- Returns:
dictionary
<<<
from pprint import pprint from math import cos from onnx_diagnostic.ext_test_case import measure_time res = measure_time(lambda: cos(0.5)) pprint(res)
>>>
{'average': np.float64(7.743404421489687e-08), 'context_size': 64, 'deviation': np.float64(1.801079762106381e-08), 'max_exec': np.float64(1.3126002158969642e-07), 'min_exec': np.float64(6.950009264983237e-08), 'number': 50, 'repeat': 10, 'ttime': np.float64(7.743404421489686e-07), 'warmup_time': 0.0018865399979404174}
See Timer.repeat for a better understanding of parameter repeat and number. The function returns a duration corresponding to number times the execution of the main statement.
- onnx_diagnostic.ext_test_case.requires_cuda(msg: str = '', version: str = '', memory: int = 0)[source]¶
Skips a test if cuda is not available.
- Parameters:
msg – to overwrite the message
version – minimum version
memory – minimum number of Gb to run the test
- onnx_diagnostic.ext_test_case.requires_diffusers(version: str, msg: str = '', or_older_than: str | None = None) Callable [source]¶
Skips a unit test if transformers is not recent enough.
- onnx_diagnostic.ext_test_case.requires_numpy(version: str, msg: str = '') Callable [source]¶
Skips a unit test if numpy is not recent enough.
- onnx_diagnostic.ext_test_case.requires_onnx(version: str, msg: str = '') Callable [source]¶
Skips a unit test if onnx is not recent enough.
- onnx_diagnostic.ext_test_case.requires_onnx_array_api(version: str, msg: str = '') Callable [source]¶
Skips a unit test if onnx-array-api is not recent enough.
- onnx_diagnostic.ext_test_case.requires_onnxruntime(version: str, msg: str = '') Callable [source]¶
Skips a unit test if onnxruntime is not recent enough.
- onnx_diagnostic.ext_test_case.requires_onnxruntime_training(push_back_batch: bool = False, ortmodule: bool = False, msg: str = '') Callable [source]¶
Skips a unit test if onnxruntime is not onnxruntime_training.
- onnx_diagnostic.ext_test_case.requires_onnxscript(version: str, msg: str = '') Callable [source]¶
Skips a unit test if onnxscript is not recent enough.
- onnx_diagnostic.ext_test_case.requires_sklearn(version: str, msg: str = '') Callable [source]¶
Skips a unit test if scikit-learn is not recent enough.
- onnx_diagnostic.ext_test_case.requires_torch(version: str, msg: str = '') Callable [source]¶
Skips a unit test if pytorch is not recent enough.
- onnx_diagnostic.ext_test_case.requires_transformers(version: str, msg: str = '', or_older_than: str | None = None) Callable [source]¶
Skips a unit test if transformers is not recent enough.
- onnx_diagnostic.ext_test_case.requires_zoo(msg: str = '') Callable [source]¶
Skips a unit test if environment variable ZOO is not equal to 1.
- onnx_diagnostic.ext_test_case.skipif_ci_apple(msg) Callable [source]¶
Skips a unit test if it runs on azure pipeline on Windows.
- onnx_diagnostic.ext_test_case.skipif_ci_linux(msg) Callable [source]¶
Skips a unit test if it runs on azure pipeline on Linux.
- onnx_diagnostic.ext_test_case.skipif_ci_windows(msg) Callable [source]¶
Skips a unit test if it runs on azure pipeline on Windows.
- onnx_diagnostic.ext_test_case.statistics_on_file(filename: str) Dict[str, str | int | float] [source]¶
Computes statistics on a file.
<<<
import pprint from onnx_diagnostic.ext_test_case import statistics_on_file, __file__ pprint.pprint(statistics_on_file(__file__))
>>>
{'chars': 26792, 'ext': '.py', 'lines': 921}
- onnx_diagnostic.ext_test_case.statistics_on_folder(folder: str | List[str], pattern: str = '.*[.]((py|rst))$', aggregation: int = 0) List[Dict[str, str | int | float]] [source]¶
Computes statistics on files in a folder.
- Parameters:
folder – folder or folders to investigate
pattern – file pattern
aggregation – show the first subfolders
- Returns:
list of dictionaries
<<<
import os import pprint from onnx_diagnostic.ext_test_case import statistics_on_folder, __file__ pprint.pprint(statistics_on_folder(os.path.dirname(__file__)))
>>>
[{'chars': 706, 'ext': '.py', 'lines': 27, 'name': 'doc.py'}, {'chars': 26792, 'ext': '.py', 'lines': 921, 'name': 'ext_test_case.py'}, {'chars': 136, 'ext': '.py', 'lines': 4, 'name': '__init__.py'}, {'chars': 19723, 'ext': '.py', 'lines': 589, 'name': 'helpers/ort_session.py'}, {'chars': 27703, 'ext': '.py', 'lines': 1019, 'name': 'helpers/helper.py'}, {'chars': 2820, 'ext': '.py', 'lines': 75, 'name': 'helpers/cache_helper.py'}, {'chars': 2878, 'ext': '.py', 'lines': 115, 'name': 'helpers/args_helper.py'}, {'chars': 6983, 'ext': '.py', 'lines': 224, 'name': 'helpers/torch_test_helper.py'}, {'chars': 20798, 'ext': '.py', 'lines': 746, 'name': 'helpers/onnx_helper.py'}, {'chars': 60, 'ext': '.py', 'lines': 1, 'name': 'helpers/__init__.py'}, {'chars': 751, 'ext': '.py', 'lines': 34, 'name': 'reference/quantized_tensor.py'}, {'chars': 11323, 'ext': '.py', 'lines': 360, 'name': 'reference/ort_evaluator.py'}, {'chars': 6199, 'ext': '.py', 'lines': 219, 'name': 'reference/evaluator.py'}, {'chars': 90, 'ext': '.py', 'lines': 2, 'name': 'reference/__init__.py'}, {'chars': 439, 'ext': '.py', 'lines': 20, 'name': 'reference/ops/op_complex.py'}, {'chars': 647, 'ext': '.py', 'lines': 27, 'name': 'reference/ops/op_fused_matmul.py'}, {'chars': 380, 'ext': '.py', 'lines': 14, 'name': 'reference/ops/op_tri_matrix.py'}, {'chars': 458, 'ext': '.py', 'lines': 17, 'name': 'reference/ops/op_quick_gelu.py'}, {'chars': 531, 'ext': '.py', 'lines': 15, 'name': 'reference/ops/op_slice.py'}, {'chars': 2582, 'ext': '.py', 'lines': 88, 'name': 'reference/ops/op_qlinear_conv.py'}, {'chars': 1161, 'ext': '.py', 'lines': 59, 'name': 'reference/ops/op_constant_of_shape.py'}, {'chars': 667, 'ext': '.py', 'lines': 16, 'name': 'reference/ops/op_scatternd_of_shape.py'}, {'chars': 147, 'ext': '.py', 'lines': 5, 'name': 'reference/ops/op_negxplus1.py'}, {'chars': 220, 'ext': '.py', 'lines': 6, 'name': 'reference/ops/op_simplified_layer_normalization.py'}, {'chars': 295, 'ext': '.py', 'lines': 10, 'name': 'reference/ops/op_transpose_cast.py'}, {'chars': 140, 'ext': '.py', 'lines': 7, 'name': 'reference/ops/op_memcpy_host.py'}, {'chars': 1405, 'ext': '.py', 'lines': 51, 'name': 'reference/ops/op_average_pool_grad.py'}, {'chars': 317, 'ext': '.py', 'lines': 9, 'name': 'reference/ops/op_gather_grad.py'}, {'chars': 853, 'ext': '.py', 'lines': 35, 'name': 'reference/ops/op_qlinear_average_pool.py'}, {'chars': 684, 'ext': '.py', 'lines': 24, 'name': 'reference/ops/op_gather.py'}, {'chars': 1419, 'ext': '.py', 'lines': 52, 'name': 'reference/ops/op_attention.py'}, {'chars': 384, 'ext': '.py', 'lines': 13, 'name': 'reference/ops/op_bias_softmax.py'}, {'chars': 224, 'ext': '.py', 'lines': 10, 'name': 'reference/ops/op_replace_zero.py'}, {'chars': 350, 'ext': '.py', 'lines': 10, 'name': 'reference/ops/op_skip_layer_normalization.py'}, {'chars': 455, 'ext': '.py', 'lines': 17, 'name': 'reference/ops/op_mul_sigmoid.py'}, {'chars': 0, 'ext': '.py', 'lines': 0, 'name': 'reference/ops/__init__.py'}, {'chars': 1139, 'ext': '.py', 'lines': 33, 'name': 'reference/ops/op_gather_elements.py'}, {'chars': 434, 'ext': '.py', 'lines': 16, 'name': 'reference/ops/op_rotary.py'}, {'chars': 383, 'ext': '.py', 'lines': 11, 'name': 'reference/ops/op_concat.py'}, {'chars': 1091, 'ext': '.py', 'lines': 44, 'name': 'reference/ops/op_add_add_mul_mul.py'}, {'chars': 2202, 'ext': '.py', 'lines': 82, 'name': 'reference/ops/op_scatter_elements.py'}, {'chars': 1001, 'ext': '.py', 'lines': 31, 'name': 'reference/ops/op_cast_like.py'}, {'chars': 0, 'ext': '.py', 'lines': 0, 'name': 'torch_onnx/__init__.py'}, {'chars': 11207, 'ext': '.py', 'lines': 349, 'name': 'torch_onnx/sbs.py'}, {'chars': 10284, 'ext': '.py', 'lines': 354, 'name': 'export/dynamic_shapes.py'}, {'chars': 36, 'ext': '.py', 'lines': 1, 'name': 'export/__init__.py'}, {'chars': 3173, 'ext': '.py', 'lines': 98, 'name': 'torch_export_patches/onnx_export_serialization.py'}, {'chars': 4030, 'ext': '.py', 'lines': 140, 'name': 'torch_export_patches/patch_inputs.py'}, {'chars': 2337, 'ext': '.py', 'lines': 66, 'name': 'torch_export_patches/__init__.py'}, {'chars': 13326, 'ext': '.py', 'lines': 354, 'name': 'torch_export_patches/onnx_export_errors.py'}, {'chars': 14772, 'ext': '.py', 'lines': 399, 'name': 'torch_export_patches/patches/patch_transformers.py'}, {'chars': 9245, 'ext': '.py', 'lines': 276, 'name': 'torch_export_patches/patches/patch_torch.py'}, {'chars': 0, 'ext': '.py', 'lines': 0, 'name': 'torch_export_patches/patches/__init__.py'}, {'chars': 0, 'ext': '.py', 'lines': 0, 'name': 'torch_models/__init__.py'}, {'chars': 82, 'ext': '.py', 'lines': 2, 'name': 'torch_models/llms.py'}, {'chars': 3887, 'ext': '.py', 'lines': 144, 'name': 'torch_models/hghub/hub_api.py'}, {'chars': 14590, 'ext': '.py', 'lines': 433, 'name': 'torch_models/hghub/model_inputs.py'}, {'chars': 6136, 'ext': '.py', 'lines': 176, 'name': 'torch_models/hghub/hub_data.py'}, {'chars': 54, 'ext': '.py', 'lines': 1, 'name': 'torch_models/hghub/__init__.py'}, {'chars': 2642, 'ext': '.py', 'lines': 84, 'name': 'torch_models/untrained/llm_phi2.py'}, {'chars': 2509, 'ext': '.py', 'lines': 78, 'name': 'torch_models/untrained/llm_tiny_llm.py'}, {'chars': 0, 'ext': '.py', 'lines': 0, 'name': 'torch_models/untrained/__init__.py'}]
Aggregated:
<<<
import os import pprint from onnx_diagnostic.ext_test_case import statistics_on_folder, __file__ pprint.pprint(statistics_on_folder(os.path.dirname(__file__), aggregation=1))
>>>
[{'chars': 706, 'dir': '', 'ext': '.py', 'lines': 27, 'name': 'doc.py'}, {'chars': 26792, 'dir': '', 'ext': '.py', 'lines': 921, 'name': 'ext_test_case.py'}, {'chars': 136, 'dir': '', 'ext': '.py', 'lines': 4, 'name': '__init__.py'}, {'chars': 19723, 'dir': 'helpers', 'ext': '.py', 'lines': 589, 'name': 'helpers/ort_session.py'}, {'chars': 27703, 'dir': 'helpers', 'ext': '.py', 'lines': 1019, 'name': 'helpers/helper.py'}, {'chars': 2820, 'dir': 'helpers', 'ext': '.py', 'lines': 75, 'name': 'helpers/cache_helper.py'}, {'chars': 2878, 'dir': 'helpers', 'ext': '.py', 'lines': 115, 'name': 'helpers/args_helper.py'}, {'chars': 6983, 'dir': 'helpers', 'ext': '.py', 'lines': 224, 'name': 'helpers/torch_test_helper.py'}, {'chars': 20798, 'dir': 'helpers', 'ext': '.py', 'lines': 746, 'name': 'helpers/onnx_helper.py'}, {'chars': 60, 'dir': 'helpers', 'ext': '.py', 'lines': 1, 'name': 'helpers/__init__.py'}, {'chars': 751, 'dir': 'reference', 'ext': '.py', 'lines': 34, 'name': 'reference/quantized_tensor.py'}, {'chars': 11323, 'dir': 'reference', 'ext': '.py', 'lines': 360, 'name': 'reference/ort_evaluator.py'}, {'chars': 6199, 'dir': 'reference', 'ext': '.py', 'lines': 219, 'name': 'reference/evaluator.py'}, {'chars': 90, 'dir': 'reference', 'ext': '.py', 'lines': 2, 'name': 'reference/__init__.py'}, {'chars': 439, 'dir': 'reference', 'ext': '.py', 'lines': 20, 'name': 'reference/ops/op_complex.py'}, {'chars': 647, 'dir': 'reference', 'ext': '.py', 'lines': 27, 'name': 'reference/ops/op_fused_matmul.py'}, {'chars': 380, 'dir': 'reference', 'ext': '.py', 'lines': 14, 'name': 'reference/ops/op_tri_matrix.py'}, {'chars': 458, 'dir': 'reference', 'ext': '.py', 'lines': 17, 'name': 'reference/ops/op_quick_gelu.py'}, {'chars': 531, 'dir': 'reference', 'ext': '.py', 'lines': 15, 'name': 'reference/ops/op_slice.py'}, {'chars': 2582, 'dir': 'reference', 'ext': '.py', 'lines': 88, 'name': 'reference/ops/op_qlinear_conv.py'}, {'chars': 1161, 'dir': 'reference', 'ext': '.py', 'lines': 59, 'name': 'reference/ops/op_constant_of_shape.py'}, {'chars': 667, 'dir': 'reference', 'ext': '.py', 'lines': 16, 'name': 'reference/ops/op_scatternd_of_shape.py'}, {'chars': 147, 'dir': 'reference', 'ext': '.py', 'lines': 5, 'name': 'reference/ops/op_negxplus1.py'}, {'chars': 220, 'dir': 'reference', 'ext': '.py', 'lines': 6, 'name': 'reference/ops/op_simplified_layer_normalization.py'}, {'chars': 295, 'dir': 'reference', 'ext': '.py', 'lines': 10, 'name': 'reference/ops/op_transpose_cast.py'}, {'chars': 140, 'dir': 'reference', 'ext': '.py', 'lines': 7, 'name': 'reference/ops/op_memcpy_host.py'}, {'chars': 1405, 'dir': 'reference', 'ext': '.py', 'lines': 51, 'name': 'reference/ops/op_average_pool_grad.py'}, {'chars': 317, 'dir': 'reference', 'ext': '.py', 'lines': 9, 'name': 'reference/ops/op_gather_grad.py'}, {'chars': 853, 'dir': 'reference', 'ext': '.py', 'lines': 35, 'name': 'reference/ops/op_qlinear_average_pool.py'}, {'chars': 684, 'dir': 'reference', 'ext': '.py', 'lines': 24, 'name': 'reference/ops/op_gather.py'}, {'chars': 1419, 'dir': 'reference', 'ext': '.py', 'lines': 52, 'name': 'reference/ops/op_attention.py'}, {'chars': 384, 'dir': 'reference', 'ext': '.py', 'lines': 13, 'name': 'reference/ops/op_bias_softmax.py'}, {'chars': 224, 'dir': 'reference', 'ext': '.py', 'lines': 10, 'name': 'reference/ops/op_replace_zero.py'}, {'chars': 350, 'dir': 'reference', 'ext': '.py', 'lines': 10, 'name': 'reference/ops/op_skip_layer_normalization.py'}, {'chars': 455, 'dir': 'reference', 'ext': '.py', 'lines': 17, 'name': 'reference/ops/op_mul_sigmoid.py'}, {'chars': 0, 'dir': 'reference', 'ext': '.py', 'lines': 0, 'name': 'reference/ops/__init__.py'}, {'chars': 1139, 'dir': 'reference', 'ext': '.py', 'lines': 33, 'name': 'reference/ops/op_gather_elements.py'}, {'chars': 434, 'dir': 'reference', 'ext': '.py', 'lines': 16, 'name': 'reference/ops/op_rotary.py'}, {'chars': 383, 'dir': 'reference', 'ext': '.py', 'lines': 11, 'name': 'reference/ops/op_concat.py'}, {'chars': 1091, 'dir': 'reference', 'ext': '.py', 'lines': 44, 'name': 'reference/ops/op_add_add_mul_mul.py'}, {'chars': 2202, 'dir': 'reference', 'ext': '.py', 'lines': 82, 'name': 'reference/ops/op_scatter_elements.py'}, {'chars': 1001, 'dir': 'reference', 'ext': '.py', 'lines': 31, 'name': 'reference/ops/op_cast_like.py'}, {'chars': 0, 'dir': 'torch_onnx', 'ext': '.py', 'lines': 0, 'name': 'torch_onnx/__init__.py'}, {'chars': 11207, 'dir': 'torch_onnx', 'ext': '.py', 'lines': 349, 'name': 'torch_onnx/sbs.py'}, {'chars': 10284, 'dir': 'export', 'ext': '.py', 'lines': 354, 'name': 'export/dynamic_shapes.py'}, {'chars': 36, 'dir': 'export', 'ext': '.py', 'lines': 1, 'name': 'export/__init__.py'}, {'chars': 3173, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 98, 'name': 'torch_export_patches/onnx_export_serialization.py'}, {'chars': 4030, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 140, 'name': 'torch_export_patches/patch_inputs.py'}, {'chars': 2337, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 66, 'name': 'torch_export_patches/__init__.py'}, {'chars': 13326, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 354, 'name': 'torch_export_patches/onnx_export_errors.py'}, {'chars': 14772, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 399, 'name': 'torch_export_patches/patches/patch_transformers.py'}, {'chars': 9245, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 276, 'name': 'torch_export_patches/patches/patch_torch.py'}, {'chars': 0, 'dir': 'torch_export_patches', 'ext': '.py', 'lines': 0, 'name': 'torch_export_patches/patches/__init__.py'}, {'chars': 0, 'dir': 'torch_models', 'ext': '.py', 'lines': 0, 'name': 'torch_models/__init__.py'}, {'chars': 82, 'dir': 'torch_models', 'ext': '.py', 'lines': 2, 'name': 'torch_models/llms.py'}, {'chars': 3887, 'dir': 'torch_models', 'ext': '.py', 'lines': 144, 'name': 'torch_models/hghub/hub_api.py'}, {'chars': 14590, 'dir': 'torch_models', 'ext': '.py', 'lines': 433, 'name': 'torch_models/hghub/model_inputs.py'}, {'chars': 6136, 'dir': 'torch_models', 'ext': '.py', 'lines': 176, 'name': 'torch_models/hghub/hub_data.py'}, {'chars': 54, 'dir': 'torch_models', 'ext': '.py', 'lines': 1, 'name': 'torch_models/hghub/__init__.py'}, {'chars': 2642, 'dir': 'torch_models', 'ext': '.py', 'lines': 84, 'name': 'torch_models/untrained/llm_phi2.py'}, {'chars': 2509, 'dir': 'torch_models', 'ext': '.py', 'lines': 78, 'name': 'torch_models/untrained/llm_tiny_llm.py'}, {'chars': 0, 'dir': 'torch_models', 'ext': '.py', 'lines': 0, 'name': 'torch_models/untrained/__init__.py'}]