Skip to content

Commit b50d1ba

Browse files
authored
Merge branch 'PaddlePaddle:develop' into tensorrt
2 parents 82c0d77 + ae2af30 commit b50d1ba

File tree

206 files changed

+343823
-10
lines changed

Some content is hidden

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

206 files changed

+343823
-10
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,11 @@ Once you have packaged these extracted computation graphs, submit them to the Gr
9898
<table>
9999
<tr>
100100
<td align="center">
101-
<img width="200" src="https://github.com/user-attachments/assets/eef90a3e-ce83-4757-94ea-b0c0757785f0" />
101+
<img width="200" src="https://github.com/user-attachments/assets/3ea4794b-1aed-4096-bd1c-3184832b98f3" />
102102
</td>
103103
<td align="center">
104104
<img width="150" src="https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/67d00cf7266d2c75571aebde_Example.svg" />
105-
<p><a href="https://discord.gg/43XQ3tf7">Channel</a> is also available.</p>
105+
<p><a href="https://discord.gg/FCZQVCkC">Channel</a> is also available.</p>
106106
</td>
107107
</tr>
108108
</table>

graph_net/paddle/test_compiler.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,23 @@ def test_single_model(args):
124124
compiled_duration_box = DurationBox(-1)
125125
with naive_timer(compiled_duration_box, synchronizer_func):
126126
compiled_out = compiled_model(**input_dict)
127+
127128
if isinstance(expected_out, paddle.Tensor):
128129
expected_out = [expected_out]
129130
compiled_out = [compiled_out]
130131
if isinstance(expected_out, list) or isinstance(expected_out, tuple):
132+
for a, b in zip(expected_out, compiled_out):
133+
if (a is None and b is not None) or (a is not None and b is None):
134+
raise ValueError("Both expected_out and compiled_out must be not None.")
131135
expected_out = [
132-
regular_item(item) for item in expected_out if np.array(item).size != 0
136+
regular_item(item)
137+
for item in expected_out
138+
if item is not None and np.array(item).size != 0
133139
]
134140
compiled_out = [
135-
regular_item(item) for item in compiled_out if np.array(item).size != 0
141+
regular_item(item)
142+
for item in compiled_out
143+
if item is not None and np.array(item).size != 0
136144
]
137145
else:
138146
raise ValueError("Illegal return value.")

graph_net/paddle/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,10 @@ def replay_tensor(info):
180180
if "data" in info and info["data"] is not None:
181181
return paddle.reshape(info["data"], shape).to(dtype).to(device)
182182
elif dtype == paddle.int32 or dtype == paddle.int64:
183-
# for some ops(binary_cross_entropy), label data can only be set 0 or 1.
184183
return paddle.cast(
185-
paddle.randint(low=0, high=2, shape=shape, dtype="int64"),
184+
paddle.randint(
185+
low=min_value, high=max_value + 1, shape=shape, dtype="int64"
186+
),
186187
dtype,
187188
).to(device)
188189
elif dtype == paddle.bool:
@@ -192,7 +193,6 @@ def replay_tensor(info):
192193
).to(device)
193194
else:
194195
std = info["info"]["std"]
195-
# return paddle.randn(shape).to(dtype).to(device) * std * 1e-3 + 1e-2
196196
return (
197197
paddle.uniform(shape, dtype="float32", min=min_value, max=max_value)
198198
.to(dtype)

graph_net/paddle/validate.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ def main(args):
6666
params.update(inputs)
6767
state_dict = {k: utils.replay_tensor(v) for k, v in params.items()}
6868

69-
y = model(**state_dict)[0]
69+
y = model(**state_dict)
7070

71-
print(np.argmin(y), np.argmax(y))
71+
# print(np.argmin(y), np.argmax(y))
7272
if isinstance(y, paddle.Tensor):
7373
print(y.shape)
7474
elif isinstance(y, list) or isinstance(y, tuple):
75-
print(y[0].shape if isinstance(y[0], paddle.tensor) else y[0])
75+
print(y[0].shape if isinstance(y[0], paddle.Tensor) else y[0])
7676
else:
7777
raise ValueError("Illegal return value.")
7878

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import unittest
2+
from graph_net.torch.rp_expr import Tokenize
3+
from graph_net.torch.rp_expr.rp_expr_passes import (
4+
FlattenTokenListPass,
5+
FoldTokensPass,
6+
RecursiveFoldTokensPass,
7+
FoldIfTokenIdGreatEqualPass,
8+
)
9+
from graph_net.torch.rp_expr.nested_range import Range, Tree
10+
from graph_net.torch.rp_expr.rp_expr_parser import RpExprParser
11+
from graph_net.torch.rp_expr.rp_expr_util import (
12+
MakeNestedIndexRangeFromLetsListTokenRpExpr,
13+
)
14+
15+
16+
class TestTokenize(unittest.TestCase):
17+
"""Tests tokenization of primitive ID lists into symbolic token sequences."""
18+
19+
def test_simple(self):
20+
primitive_id_lists = [list(range(10 + i)) for i in range(5)]
21+
token_list, id_allocator, _ = Tokenize(primitive_id_lists)
22+
self.assertEqual(len(token_list.tensors), len(primitive_id_lists))
23+
24+
25+
class TestFlattenTokenListPass(unittest.TestCase):
26+
"""Tests flattening of nested token structures into linear sequences."""
27+
28+
def test_simple(self):
29+
base = 10
30+
size = 5
31+
primitive_id_lists = [list(range(base + i)) for i in range(size)]
32+
token_list, id_allocator, _ = Tokenize(primitive_id_lists)
33+
rp_expr_pass = FlattenTokenListPass(id_allocator)
34+
success, flattened_rp_expr_pass = rp_expr_pass(token_list)
35+
self.assertTrue(success)
36+
self.assertEqual(id_allocator.NextTokenId(), base + 2 * size - 1)
37+
38+
39+
class TestFoldTokensPass(unittest.TestCase):
40+
"""Tests folding of the most frequent contiguous token pattern into a single symbol."""
41+
42+
def test_simple(self):
43+
base = 3
44+
size = 3
45+
primitive_id_lists = [list(range(base + i)) for i in range(size)]
46+
token_list, id_allocator, _ = Tokenize(primitive_id_lists)
47+
flatten_pass = FlattenTokenListPass(id_allocator)
48+
_, flattened_rp_expr = flatten_pass(token_list)
49+
fold_pass = FoldTokensPass(id_allocator)
50+
success, fold_rp_expr = fold_pass(flattened_rp_expr.flattened_tensor)
51+
self.assertTrue(success)
52+
input = flattened_rp_expr.flattened_tensor.tensor.numpy().tolist()
53+
pattern = fold_rp_expr.symbol_token_tensors[0].numpy().tolist()
54+
replacement = fold_rp_expr.symbol_token_ids[0]
55+
output = fold_rp_expr.body_rp_expr.tensor.numpy().tolist()
56+
self.assertEqual(input, [3, 4, 5, 1, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7])
57+
self.assertEqual(pattern, [3, 4, 5])
58+
self.assertEqual(replacement, 8)
59+
self.assertEqual(output, [8, 1, 8, 6, 2, 8, 6, 7])
60+
61+
62+
class TestRecursiveFoldTokensPass(unittest.TestCase):
63+
"""Tests recursive folding of repeated patterns at multiple levels of nesting."""
64+
65+
def test_simple(self):
66+
base = 3
67+
size = 3
68+
primitive_id_lists = [list(range(base + i)) for i in range(size)]
69+
token_list, id_allocator, _ = Tokenize(primitive_id_lists)
70+
flatten_pass = FlattenTokenListPass(id_allocator)
71+
_, flattened_rp_expr = flatten_pass(token_list)
72+
fold_pass = RecursiveFoldTokensPass(id_allocator)
73+
success, fold_rp_expr = fold_pass(flattened_rp_expr.flattened_tensor)
74+
self.assertTrue(success)
75+
input = flattened_rp_expr.flattened_tensor.tensor.numpy().tolist()
76+
pattern = [x.numpy().tolist() for x in fold_rp_expr.symbol_token_tensors]
77+
replacement = fold_rp_expr.symbol_token_ids
78+
output = fold_rp_expr.body_rp_expr.tensor.numpy().tolist()
79+
self.assertEqual(input, [3, 4, 5, 1, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7])
80+
self.assertEqual(pattern, [[3, 4, 5], [8, 6]])
81+
self.assertEqual(replacement, [8, 9])
82+
self.assertEqual(output, [8, 1, 9, 2, 9, 7])
83+
84+
85+
class TestFoldIfTokenIdGreatEqualPass(unittest.TestCase):
86+
"""Tests conditional folding only for tokens with ID greater than or equal to a threshold."""
87+
88+
def test_simple(self):
89+
base = 3
90+
size = 3
91+
primitive_id_lists = [list(range(base + i)) for i in range(size)]
92+
token_list, id_allocator, _ = Tokenize(primitive_id_lists)
93+
flatten_pass = FlattenTokenListPass(id_allocator)
94+
_, flattened_rp_expr = flatten_pass(token_list)
95+
fold_pass = RecursiveFoldTokensPass(id_allocator)
96+
success, fold_rp_expr = fold_pass(flattened_rp_expr.flattened_tensor)
97+
self.assertTrue(success)
98+
threshold_fold_pass = FoldIfTokenIdGreatEqualPass(
99+
id_allocator=id_allocator,
100+
threshold_start_token_id=len(primitive_id_lists),
101+
)
102+
success, threshold_fold_rp_expr = threshold_fold_pass(fold_rp_expr.body_rp_expr)
103+
self.assertTrue(success)
104+
input = fold_rp_expr.body_rp_expr.tensor.numpy().tolist()
105+
pattern = [
106+
x.numpy().tolist() for x in threshold_fold_rp_expr.symbol_token_tensors
107+
]
108+
replacement = threshold_fold_rp_expr.symbol_token_ids
109+
self.assertEqual(len(threshold_fold_rp_expr.body_rp_expr), 3)
110+
output = [x.numpy().tolist() for x in threshold_fold_rp_expr.body_rp_expr]
111+
self.assertEqual(input, [8, 1, 9, 2, 9, 7])
112+
self.assertEqual(pattern, [[9, 7]])
113+
self.assertEqual(replacement, [10])
114+
self.assertEqual(output, [[8], [9], [10]])
115+
116+
117+
if __name__ == "__main__":
118+
unittest.main()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from .rp_expr import Tokenize
2+
from .rp_expr_parser import RpExprParser
3+
from .nested_range import Range, Tree
4+
from .rp_expr_util import MakeNestedIndexRangeFromLetsListTokenRpExpr
5+
from .rp_expr_passes import (
6+
FlattenTokenListPass,
7+
FoldTokensPass,
8+
RecursiveFoldTokensPass,
9+
FoldIfTokenIdGreatEqualPass,
10+
)
11+
12+
__all__ = [
13+
"Tokenize",
14+
"RpExprParser",
15+
"Range",
16+
"Tree",
17+
"MakeNestedIndexRangeFromLetsListTokenRpExpr",
18+
"FlattenTokenListPass",
19+
"FoldTokensPass",
20+
"RecursiveFoldTokensPass",
21+
"FoldIfTokenIdGreatEqualPass",
22+
]

0 commit comments

Comments
 (0)