Skip to content

Commit 9372e9a

Browse files
skottmckaycarzh
andauthored
Support >2GB of Tensor data in training checkpoint (microsoft#20077)
### Description <!-- Describe your changes. --> Add ability to store initializer data in an external file. Update training checkpoint code to use external file if data > ~2GB. I don't see a way for the flatbuffers 64-bit offsets to be used, as they don't support storing 'table' types with 64-bit offsets (and our Tensor is a 'table' type not a simple struct). https://github.com/google/flatbuffers/blob/0cfb7eb80b05c058e19e50fb575263908e601469/tests/64bit/test_64bit.fbs#L38-L39 Allowing a Tensor to have its raw_data in an external file should hopefully work with the least friction. As it's an extra field it's backwards compatible. Please feel free to suggest alternative approaches. Side note: the diffs in the generated *.fbs.h files are unexpectedly large. Maybe they weren't re-generated when the new flatbuffers version was checked in. I updated by running: `python .\compile_schema.py -f <build output dir>\_deps\flatbuffers-build\Debug\flatc.exe` from onnxruntime\core\flatbuffers\schema which I thought was the correct way but maybe that's out of date. I think you can ignore all the diffs in the generated files and just worry about the changes to the .fbs files in onnxruntime/core/flatbuffers/schema. Basically start at the bottom of the files changed and work up as all the 'real' diffs are there. ### Motivation and Context <!-- - Why is this change required? What problem does it solve? - If it fixes an open issue, please link to the issue here. --> --------- Co-authored-by: carzh <[email protected]>
1 parent 4385602 commit 9372e9a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+3873
-1363
lines changed

.lintrunner.toml

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ exclude_patterns = [
130130
'js/**',
131131
'onnxruntime/contrib_ops/cuda/bert/tensorrt_fused_multihead_attention/**', # Contains data chunks
132132
'onnxruntime/core/flatbuffers/schema/*.fbs.h', # Generated code
133+
'onnxruntime/test/flatbuffers/*.fbs.h', # Generated code
133134
'onnxruntime/core/graph/contrib_ops/quantization_defs.cc',
134135
'onnxruntime/core/mlas/**', # Contains assembly code
135136
'onnxruntime/core/mickey/cutlass_ext/**', # CUTLASS lib recommends NO automatic code formatting

cmake/onnxruntime_unittests.cmake

+8-2
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,16 @@ file(GLOB onnxruntime_test_common_src CONFIGURE_DEPENDS
250250
"${TEST_SRC_DIR}/common/logging/*.h"
251251
)
252252

253-
file(GLOB onnxruntime_test_quantiztion_src CONFIGURE_DEPENDS
253+
file(GLOB onnxruntime_test_quantization_src CONFIGURE_DEPENDS
254254
"${TEST_SRC_DIR}/quantization/*.cc"
255255
"${TEST_SRC_DIR}/quantization/*.h"
256256
)
257257

258+
file(GLOB onnxruntime_test_flatbuffers_src CONFIGURE_DEPENDS
259+
"${TEST_SRC_DIR}/flatbuffers/*.cc"
260+
"${TEST_SRC_DIR}/flatbuffers/*.h"
261+
)
262+
258263
if(NOT onnxruntime_MINIMAL_BUILD AND NOT onnxruntime_REDUCED_OPS_BUILD)
259264

260265
file(GLOB onnxruntime_test_ir_src CONFIGURE_DEPENDS
@@ -767,7 +772,8 @@ if(NOT IOS)
767772
endif()
768773

769774
set(all_tests ${onnxruntime_test_common_src} ${onnxruntime_test_ir_src} ${onnxruntime_test_optimizer_src}
770-
${onnxruntime_test_framework_src} ${onnxruntime_test_providers_src} ${onnxruntime_test_quantiztion_src})
775+
${onnxruntime_test_framework_src} ${onnxruntime_test_providers_src} ${onnxruntime_test_quantization_src}
776+
${onnxruntime_test_flatbuffers_src})
771777

772778
if (onnxruntime_ENABLE_CUDA_EP_INTERNAL_TESTS)
773779
file(GLOB onnxruntime_test_providers_cuda_ut_src CONFIGURE_DEPENDS

onnxruntime/core/flatbuffers/flatbuffers_utils.cc

-1
Original file line numberDiff line numberDiff line change
@@ -315,5 +315,4 @@ bool IsOrtFormatModelBytes(const void* bytes, int num_bytes) {
315315
return num_bytes > 8 && // check buffer is large enough to contain identifier so we don't read random memory
316316
fbs::InferenceSessionBufferHasIdentifier(bytes);
317317
}
318-
319318
} // namespace onnxruntime::fbs::utils

onnxruntime/core/flatbuffers/ort_flatbuffers_py/fbs/ArgType.py

-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,3 @@
55
class ArgType(object):
66
INPUT = 0
77
OUTPUT = 1
8-

onnxruntime/core/flatbuffers/ort_flatbuffers_py/fbs/ArgTypeAndIndex.py

+28-5
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ class ArgTypeAndIndex(object):
1010
__slots__ = ['_tab']
1111

1212
@classmethod
13-
def GetRootAsArgTypeAndIndex(cls, buf, offset):
13+
def GetRootAs(cls, buf, offset=0):
1414
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
1515
x = ArgTypeAndIndex()
1616
x.Init(buf, n + offset)
1717
return x
1818

1919
@classmethod
20+
def GetRootAsArgTypeAndIndex(cls, buf, offset=0):
21+
"""This method is deprecated. Please switch to GetRootAs."""
22+
return cls.GetRootAs(buf, offset)
23+
@classmethod
2024
def ArgTypeAndIndexBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
2125
return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x4F\x52\x54\x4D", size_prefixed=size_prefixed)
2226

@@ -38,7 +42,26 @@ def Index(self):
3842
return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos)
3943
return 0
4044

41-
def ArgTypeAndIndexStart(builder): builder.StartObject(2)
42-
def ArgTypeAndIndexAddArgType(builder, argType): builder.PrependInt8Slot(0, argType, 0)
43-
def ArgTypeAndIndexAddIndex(builder, index): builder.PrependUint32Slot(1, index, 0)
44-
def ArgTypeAndIndexEnd(builder): return builder.EndObject()
45+
def ArgTypeAndIndexStart(builder):
46+
builder.StartObject(2)
47+
48+
def Start(builder):
49+
ArgTypeAndIndexStart(builder)
50+
51+
def ArgTypeAndIndexAddArgType(builder, argType):
52+
builder.PrependInt8Slot(0, argType, 0)
53+
54+
def AddArgType(builder, argType):
55+
ArgTypeAndIndexAddArgType(builder, argType)
56+
57+
def ArgTypeAndIndexAddIndex(builder, index):
58+
builder.PrependUint32Slot(1, index, 0)
59+
60+
def AddIndex(builder, index):
61+
ArgTypeAndIndexAddIndex(builder, index)
62+
63+
def ArgTypeAndIndexEnd(builder):
64+
return builder.EndObject()
65+
66+
def End(builder):
67+
return ArgTypeAndIndexEnd(builder)

onnxruntime/core/flatbuffers/ort_flatbuffers_py/fbs/Attribute.py

+124-21
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ class Attribute(object):
1010
__slots__ = ['_tab']
1111

1212
@classmethod
13-
def GetRootAsAttribute(cls, buf, offset):
13+
def GetRootAs(cls, buf, offset=0):
1414
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
1515
x = Attribute()
1616
x.Init(buf, n + offset)
1717
return x
1818

1919
@classmethod
20+
def GetRootAsAttribute(cls, buf, offset=0):
21+
"""This method is deprecated. Please switch to GetRootAs."""
22+
return cls.GetRootAs(buf, offset)
23+
@classmethod
2024
def AttributeBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
2125
return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x4F\x52\x54\x4D", size_prefixed=size_prefixed)
2226

@@ -212,23 +216,122 @@ def GraphsIsNone(self):
212216
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28))
213217
return o == 0
214218

215-
def AttributeStart(builder): builder.StartObject(13)
216-
def AttributeAddName(builder, name): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)
217-
def AttributeAddDocString(builder, docString): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(docString), 0)
218-
def AttributeAddType(builder, type): builder.PrependInt32Slot(2, type, 0)
219-
def AttributeAddF(builder, f): builder.PrependFloat32Slot(3, f, 0.0)
220-
def AttributeAddI(builder, i): builder.PrependInt64Slot(4, i, 0)
221-
def AttributeAddS(builder, s): builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(s), 0)
222-
def AttributeAddT(builder, t): builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(t), 0)
223-
def AttributeAddG(builder, g): builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(g), 0)
224-
def AttributeAddFloats(builder, floats): builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(floats), 0)
225-
def AttributeStartFloatsVector(builder, numElems): return builder.StartVector(4, numElems, 4)
226-
def AttributeAddInts(builder, ints): builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(ints), 0)
227-
def AttributeStartIntsVector(builder, numElems): return builder.StartVector(8, numElems, 8)
228-
def AttributeAddStrings(builder, strings): builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(strings), 0)
229-
def AttributeStartStringsVector(builder, numElems): return builder.StartVector(4, numElems, 4)
230-
def AttributeAddTensors(builder, tensors): builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(tensors), 0)
231-
def AttributeStartTensorsVector(builder, numElems): return builder.StartVector(4, numElems, 4)
232-
def AttributeAddGraphs(builder, graphs): builder.PrependUOffsetTRelativeSlot(12, flatbuffers.number_types.UOffsetTFlags.py_type(graphs), 0)
233-
def AttributeStartGraphsVector(builder, numElems): return builder.StartVector(4, numElems, 4)
234-
def AttributeEnd(builder): return builder.EndObject()
219+
def AttributeStart(builder):
220+
builder.StartObject(13)
221+
222+
def Start(builder):
223+
AttributeStart(builder)
224+
225+
def AttributeAddName(builder, name):
226+
builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)
227+
228+
def AddName(builder, name):
229+
AttributeAddName(builder, name)
230+
231+
def AttributeAddDocString(builder, docString):
232+
builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(docString), 0)
233+
234+
def AddDocString(builder, docString):
235+
AttributeAddDocString(builder, docString)
236+
237+
def AttributeAddType(builder, type):
238+
builder.PrependInt32Slot(2, type, 0)
239+
240+
def AddType(builder, type):
241+
AttributeAddType(builder, type)
242+
243+
def AttributeAddF(builder, f):
244+
builder.PrependFloat32Slot(3, f, 0.0)
245+
246+
def AddF(builder, f):
247+
AttributeAddF(builder, f)
248+
249+
def AttributeAddI(builder, i):
250+
builder.PrependInt64Slot(4, i, 0)
251+
252+
def AddI(builder, i):
253+
AttributeAddI(builder, i)
254+
255+
def AttributeAddS(builder, s):
256+
builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(s), 0)
257+
258+
def AddS(builder, s):
259+
AttributeAddS(builder, s)
260+
261+
def AttributeAddT(builder, t):
262+
builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(t), 0)
263+
264+
def AddT(builder, t):
265+
AttributeAddT(builder, t)
266+
267+
def AttributeAddG(builder, g):
268+
builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(g), 0)
269+
270+
def AddG(builder, g):
271+
AttributeAddG(builder, g)
272+
273+
def AttributeAddFloats(builder, floats):
274+
builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(floats), 0)
275+
276+
def AddFloats(builder, floats):
277+
AttributeAddFloats(builder, floats)
278+
279+
def AttributeStartFloatsVector(builder, numElems):
280+
return builder.StartVector(4, numElems, 4)
281+
282+
def StartFloatsVector(builder, numElems: int) -> int:
283+
return AttributeStartFloatsVector(builder, numElems)
284+
285+
def AttributeAddInts(builder, ints):
286+
builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(ints), 0)
287+
288+
def AddInts(builder, ints):
289+
AttributeAddInts(builder, ints)
290+
291+
def AttributeStartIntsVector(builder, numElems):
292+
return builder.StartVector(8, numElems, 8)
293+
294+
def StartIntsVector(builder, numElems: int) -> int:
295+
return AttributeStartIntsVector(builder, numElems)
296+
297+
def AttributeAddStrings(builder, strings):
298+
builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(strings), 0)
299+
300+
def AddStrings(builder, strings):
301+
AttributeAddStrings(builder, strings)
302+
303+
def AttributeStartStringsVector(builder, numElems):
304+
return builder.StartVector(4, numElems, 4)
305+
306+
def StartStringsVector(builder, numElems: int) -> int:
307+
return AttributeStartStringsVector(builder, numElems)
308+
309+
def AttributeAddTensors(builder, tensors):
310+
builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(tensors), 0)
311+
312+
def AddTensors(builder, tensors):
313+
AttributeAddTensors(builder, tensors)
314+
315+
def AttributeStartTensorsVector(builder, numElems):
316+
return builder.StartVector(4, numElems, 4)
317+
318+
def StartTensorsVector(builder, numElems: int) -> int:
319+
return AttributeStartTensorsVector(builder, numElems)
320+
321+
def AttributeAddGraphs(builder, graphs):
322+
builder.PrependUOffsetTRelativeSlot(12, flatbuffers.number_types.UOffsetTFlags.py_type(graphs), 0)
323+
324+
def AddGraphs(builder, graphs):
325+
AttributeAddGraphs(builder, graphs)
326+
327+
def AttributeStartGraphsVector(builder, numElems):
328+
return builder.StartVector(4, numElems, 4)
329+
330+
def StartGraphsVector(builder, numElems: int) -> int:
331+
return AttributeStartGraphsVector(builder, numElems)
332+
333+
def AttributeEnd(builder):
334+
return builder.EndObject()
335+
336+
def End(builder):
337+
return AttributeEnd(builder)

onnxruntime/core/flatbuffers/ort_flatbuffers_py/fbs/AttributeType.py

-1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,3 @@ class AttributeType(object):
1616
GRAPHS = 10
1717
SPARSE_TENSOR = 11
1818
SPARSE_TENSORS = 12
19-

onnxruntime/core/flatbuffers/ort_flatbuffers_py/fbs/Checkpoint.py

+46-8
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ class Checkpoint(object):
1010
__slots__ = ['_tab']
1111

1212
@classmethod
13-
def GetRootAsCheckpoint(cls, buf, offset):
13+
def GetRootAs(cls, buf, offset=0):
1414
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
1515
x = Checkpoint()
1616
x.Init(buf, n + offset)
1717
return x
1818

1919
@classmethod
20+
def GetRootAsCheckpoint(cls, buf, offset=0):
21+
"""This method is deprecated. Please switch to GetRootAs."""
22+
return cls.GetRootAs(buf, offset)
23+
@classmethod
2024
def CheckpointBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
2125
return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x4F\x44\x54\x43", size_prefixed=size_prefixed)
2226

@@ -78,10 +82,44 @@ def PropertyBag(self):
7882
return obj
7983
return None
8084

81-
def CheckpointStart(builder): builder.StartObject(4)
82-
def CheckpointAddVersion(builder, version): builder.PrependInt32Slot(0, version, 0)
83-
def CheckpointAddModuleState(builder, moduleState): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(moduleState), 0)
84-
def CheckpointAddOptimizerGroups(builder, optimizerGroups): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(optimizerGroups), 0)
85-
def CheckpointStartOptimizerGroupsVector(builder, numElems): return builder.StartVector(4, numElems, 4)
86-
def CheckpointAddPropertyBag(builder, propertyBag): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(propertyBag), 0)
87-
def CheckpointEnd(builder): return builder.EndObject()
85+
def CheckpointStart(builder):
86+
builder.StartObject(4)
87+
88+
def Start(builder):
89+
CheckpointStart(builder)
90+
91+
def CheckpointAddVersion(builder, version):
92+
builder.PrependInt32Slot(0, version, 0)
93+
94+
def AddVersion(builder, version):
95+
CheckpointAddVersion(builder, version)
96+
97+
def CheckpointAddModuleState(builder, moduleState):
98+
builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(moduleState), 0)
99+
100+
def AddModuleState(builder, moduleState):
101+
CheckpointAddModuleState(builder, moduleState)
102+
103+
def CheckpointAddOptimizerGroups(builder, optimizerGroups):
104+
builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(optimizerGroups), 0)
105+
106+
def AddOptimizerGroups(builder, optimizerGroups):
107+
CheckpointAddOptimizerGroups(builder, optimizerGroups)
108+
109+
def CheckpointStartOptimizerGroupsVector(builder, numElems):
110+
return builder.StartVector(4, numElems, 4)
111+
112+
def StartOptimizerGroupsVector(builder, numElems: int) -> int:
113+
return CheckpointStartOptimizerGroupsVector(builder, numElems)
114+
115+
def CheckpointAddPropertyBag(builder, propertyBag):
116+
builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(propertyBag), 0)
117+
118+
def AddPropertyBag(builder, propertyBag):
119+
CheckpointAddPropertyBag(builder, propertyBag)
120+
121+
def CheckpointEnd(builder):
122+
return builder.EndObject()
123+
124+
def End(builder):
125+
return CheckpointEnd(builder)

onnxruntime/core/flatbuffers/ort_flatbuffers_py/fbs/DeprecatedKernelCreateInfos.py

+40-7
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ class DeprecatedKernelCreateInfos(object):
1111
__slots__ = ['_tab']
1212

1313
@classmethod
14-
def GetRootAsDeprecatedKernelCreateInfos(cls, buf, offset):
14+
def GetRootAs(cls, buf, offset=0):
1515
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
1616
x = DeprecatedKernelCreateInfos()
1717
x.Init(buf, n + offset)
1818
return x
1919

2020
@classmethod
21+
def GetRootAsDeprecatedKernelCreateInfos(cls, buf, offset=0):
22+
"""This method is deprecated. Please switch to GetRootAs."""
23+
return cls.GetRootAs(buf, offset)
24+
@classmethod
2125
def DeprecatedKernelCreateInfosBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
2226
return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x4F\x52\x54\x4D", size_prefixed=size_prefixed)
2327

@@ -79,9 +83,38 @@ def KernelDefHashesIsNone(self):
7983
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
8084
return o == 0
8185

82-
def DeprecatedKernelCreateInfosStart(builder): builder.StartObject(2)
83-
def DeprecatedKernelCreateInfosAddNodeIndices(builder, nodeIndices): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(nodeIndices), 0)
84-
def DeprecatedKernelCreateInfosStartNodeIndicesVector(builder, numElems): return builder.StartVector(4, numElems, 4)
85-
def DeprecatedKernelCreateInfosAddKernelDefHashes(builder, kernelDefHashes): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(kernelDefHashes), 0)
86-
def DeprecatedKernelCreateInfosStartKernelDefHashesVector(builder, numElems): return builder.StartVector(8, numElems, 8)
87-
def DeprecatedKernelCreateInfosEnd(builder): return builder.EndObject()
86+
def DeprecatedKernelCreateInfosStart(builder):
87+
builder.StartObject(2)
88+
89+
def Start(builder):
90+
DeprecatedKernelCreateInfosStart(builder)
91+
92+
def DeprecatedKernelCreateInfosAddNodeIndices(builder, nodeIndices):
93+
builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(nodeIndices), 0)
94+
95+
def AddNodeIndices(builder, nodeIndices):
96+
DeprecatedKernelCreateInfosAddNodeIndices(builder, nodeIndices)
97+
98+
def DeprecatedKernelCreateInfosStartNodeIndicesVector(builder, numElems):
99+
return builder.StartVector(4, numElems, 4)
100+
101+
def StartNodeIndicesVector(builder, numElems: int) -> int:
102+
return DeprecatedKernelCreateInfosStartNodeIndicesVector(builder, numElems)
103+
104+
def DeprecatedKernelCreateInfosAddKernelDefHashes(builder, kernelDefHashes):
105+
builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(kernelDefHashes), 0)
106+
107+
def AddKernelDefHashes(builder, kernelDefHashes):
108+
DeprecatedKernelCreateInfosAddKernelDefHashes(builder, kernelDefHashes)
109+
110+
def DeprecatedKernelCreateInfosStartKernelDefHashesVector(builder, numElems):
111+
return builder.StartVector(8, numElems, 8)
112+
113+
def StartKernelDefHashesVector(builder, numElems: int) -> int:
114+
return DeprecatedKernelCreateInfosStartKernelDefHashesVector(builder, numElems)
115+
116+
def DeprecatedKernelCreateInfosEnd(builder):
117+
return builder.EndObject()
118+
119+
def End(builder):
120+
return DeprecatedKernelCreateInfosEnd(builder)

0 commit comments

Comments
 (0)