Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
zhaoyu6
sglang
Commits
e822e590
"src/include/ConstantTensorDescriptor.hpp" did not exist on "079d63a788f7d39381ce1513b7c9090d3ac3f439"
Unverified
Commit
e822e590
authored
Apr 18, 2024
by
Ke Bao
Committed by
GitHub
Apr 17, 2024
Browse files
Optimize radix tree matching (#364)
parent
ca4f1ab8
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
28 deletions
+35
-28
python/sglang/srt/managers/router/radix_cache.py
python/sglang/srt/managers/router/radix_cache.py
+35
-28
No files found.
python/sglang/srt/managers/router/radix_cache.py
View file @
e822e590
...
@@ -11,6 +11,7 @@ class TreeNode:
...
@@ -11,6 +11,7 @@ class TreeNode:
def
__init__
(
self
):
def
__init__
(
self
):
self
.
children
=
defaultdict
(
TreeNode
)
self
.
children
=
defaultdict
(
TreeNode
)
self
.
parent
=
None
self
.
parent
=
None
self
.
key
=
None
self
.
value
=
None
self
.
value
=
None
self
.
ref_counter
=
0
self
.
ref_counter
=
0
self
.
last_access_time
=
time
.
time
()
self
.
last_access_time
=
time
.
time
()
...
@@ -37,6 +38,7 @@ class RadixCache:
...
@@ -37,6 +38,7 @@ class RadixCache:
def
reset
(
self
):
def
reset
(
self
):
self
.
root_node
=
TreeNode
()
self
.
root_node
=
TreeNode
()
self
.
root_node
.
key
=
[]
self
.
root_node
.
value
=
[]
self
.
root_node
.
value
=
[]
self
.
root_node
.
ref_counter
=
1
self
.
root_node
.
ref_counter
=
1
self
.
evictable_size_
=
0
self
.
evictable_size_
=
0
...
@@ -115,40 +117,45 @@ class RadixCache:
...
@@ -115,40 +117,45 @@ class RadixCache:
##### Internal Helper Functions #####
##### Internal Helper Functions #####
def
_match_prefix_helper
(
self
,
node
,
key
,
value
,
last_node
):
def
_match_prefix_helper
(
self
,
node
,
key
,
value
,
last_node
):
node
.
last_access_time
=
time
.
time
()
node
.
last_access_time
=
time
.
time
()
if
len
(
key
)
==
0
:
for
c_key
,
child
in
node
.
children
.
items
():
return
prefix_len
=
match
(
c_key
,
key
)
if
prefix_len
!=
0
:
if
key
[
0
]
in
node
.
children
.
keys
():
if
prefix_len
<
len
(
c_key
):
child
=
node
.
children
[
key
[
0
]]
new_node
=
self
.
_split_node
(
c_key
,
child
,
prefix_len
)
prefix_len
=
match
(
child
.
key
,
key
)
value
.
append
(
new_node
.
value
)
if
prefix_len
<
len
(
child
.
key
):
last_node
[
0
]
=
new_node
new_node
=
self
.
_split_node
(
child
.
key
,
child
,
prefix_len
)
else
:
value
.
append
(
new_node
.
value
)
value
.
append
(
child
.
value
)
last_node
[
0
]
=
new_node
last_node
[
0
]
=
child
else
:
self
.
_match_prefix_helper
(
child
,
key
[
prefix_len
:],
value
,
last_node
)
value
.
append
(
child
.
value
)
break
last_node
[
0
]
=
child
self
.
_match_prefix_helper
(
child
,
key
[
prefix_len
:],
value
,
last_node
)
def
_split_node
(
self
,
key
,
child
,
split_len
):
def
_split_node
(
self
,
key
,
child
,
split_len
):
# new_node -> child
# new_node -> child
new_node
=
TreeNode
()
new_node
=
TreeNode
()
new_node
.
children
=
{
key
[
split_len
:]:
child
}
new_node
.
children
=
{
key
[
split_len
:]
[
0
]
:
child
}
new_node
.
parent
=
child
.
parent
new_node
.
parent
=
child
.
parent
new_node
.
ref_counter
=
child
.
ref_counter
new_node
.
ref_counter
=
child
.
ref_counter
new_node
.
key
=
child
.
key
[:
split_len
]
new_node
.
value
=
child
.
value
[:
split_len
]
new_node
.
value
=
child
.
value
[:
split_len
]
child
.
parent
=
new_node
child
.
parent
=
new_node
child
.
key
=
child
.
key
[
split_len
:]
child
.
value
=
child
.
value
[
split_len
:]
child
.
value
=
child
.
value
[
split_len
:]
new_node
.
parent
.
children
[
key
[:
split_len
]]
=
new_node
new_node
.
parent
.
children
[
key
[:
split_len
][
0
]]
=
new_node
del
new_node
.
parent
.
children
[
key
]
return
new_node
return
new_node
def
_insert_helper
(
self
,
node
,
key
,
value
):
def
_insert_helper
(
self
,
node
,
key
,
value
):
node
.
last_access_time
=
time
.
time
()
node
.
last_access_time
=
time
.
time
()
if
len
(
key
)
==
0
:
return
0
for
c_key
,
child
in
node
.
children
.
items
():
if
key
[
0
]
in
node
.
children
.
keys
():
prefix_len
=
match
(
c_key
,
key
)
child
=
node
.
children
[
key
[
0
]]
prefix_len
=
match
(
child
.
key
,
key
)
if
prefix_len
==
len
(
c
_
key
):
if
prefix_len
==
len
(
c
hild
.
key
):
if
prefix_len
==
len
(
key
):
if
prefix_len
==
len
(
key
):
return
prefix_len
return
prefix_len
else
:
else
:
...
@@ -156,23 +163,23 @@ class RadixCache:
...
@@ -156,23 +163,23 @@ class RadixCache:
value
=
value
[
prefix_len
:]
value
=
value
[
prefix_len
:]
return
prefix_len
+
self
.
_insert_helper
(
child
,
key
,
value
)
return
prefix_len
+
self
.
_insert_helper
(
child
,
key
,
value
)
if
prefix_len
:
new_node
=
self
.
_split_node
(
child
.
key
,
child
,
prefix_len
)
new_node
=
self
.
_split_node
(
c_key
,
child
,
prefix_len
)
return
prefix_len
+
self
.
_insert_helper
(
return
prefix_len
+
self
.
_insert_helper
(
new_node
,
key
[
prefix_len
:],
value
[
prefix_len
:]
new_node
,
key
[
prefix_len
:],
value
[
prefix_len
:]
)
)
if
len
(
key
):
if
len
(
key
):
new_node
=
TreeNode
()
new_node
=
TreeNode
()
new_node
.
parent
=
node
new_node
.
parent
=
node
new_node
.
key
=
key
new_node
.
value
=
value
new_node
.
value
=
value
node
.
children
[
key
]
=
new_node
node
.
children
[
key
[
0
]
]
=
new_node
self
.
evictable_size_
+=
len
(
value
)
self
.
evictable_size_
+=
len
(
value
)
return
0
return
0
def
_print_helper
(
self
,
node
,
indent
):
def
_print_helper
(
self
,
node
,
indent
):
for
key
,
child
in
node
.
children
.
items
():
for
_
,
child
in
node
.
children
.
items
():
print
(
" "
*
indent
,
len
(
key
),
key
[:
10
],
f
"r=
{
child
.
ref_counter
}
"
)
print
(
" "
*
indent
,
len
(
child
.
key
),
child
.
key
[:
10
],
f
"r=
{
child
.
ref_counter
}
"
)
self
.
_print_helper
(
child
,
indent
=
indent
+
2
)
self
.
_print_helper
(
child
,
indent
=
indent
+
2
)
def
_delete_leaf
(
self
,
node
):
def
_delete_leaf
(
self
,
node
):
...
@@ -180,7 +187,7 @@ class RadixCache:
...
@@ -180,7 +187,7 @@ class RadixCache:
if
v
==
node
:
if
v
==
node
:
break
break
del
node
.
parent
.
children
[
k
]
del
node
.
parent
.
children
[
k
]
self
.
evictable_size_
-=
len
(
k
)
self
.
evictable_size_
-=
len
(
node
.
key
)
def
_total_size_helper
(
self
,
node
):
def
_total_size_helper
(
self
,
node
):
x
=
len
(
node
.
value
)
x
=
len
(
node
.
value
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment