9
9
from .manager import LlmSystemManager
10
10
import asyncio
11
11
12
+ from typing import override
13
+
12
14
13
15
class FiberPool :
14
16
"""
@@ -33,64 +35,105 @@ def __init__(
33
35
self .name : str = name
34
36
35
37
# Name mangle to make outside access harder.
36
- self .__fiber_pool : list [sf .Fiber ] = []
37
- self .__workers : list [sf .Worker ] = []
38
+ self ._fiber_pool : list [sf .Fiber ] = []
39
+ self ._workers : list [sf .Worker ] = []
38
40
# Keep track of how many extra fibers were created
39
41
# during runtime if `resizable` is set to True.
40
- self .__extra_fibers : int = 0
41
- self .__index_queue = asyncio .Queue ()
42
+ self ._extra_fibers : int = 0
43
+ self ._index_queue = asyncio .Queue ()
44
+
45
+ self ._initialize_pool ()
42
46
43
- self .__initialize_pool ()
47
+ def resize (self ):
48
+ new_worker = self .sysman .ls .create_worker (
49
+ f"{ self .name } -new-worker-{ self ._extra_fibers } "
50
+ )
51
+ self ._workers .append (new_worker )
52
+ fiber = self .sysman .ls .create_fiber (new_worker )
53
+ self ._fiber_pool .append (fiber )
54
+ self ._extra_fibers += 1
55
+
56
+ return [self .size () - 1 , fiber ]
44
57
45
58
async def get (self ) -> tuple [int , sf .Fiber ]:
46
59
try :
47
- idx = self .__index_queue .get_nowait ()
60
+ idx = self ._index_queue .get_nowait ()
48
61
return (
49
62
idx ,
50
- self .__fiber_pool [idx ],
63
+ self ._fiber_pool [idx ],
51
64
)
52
65
except asyncio .QueueEmpty :
53
66
if self .resizable :
54
67
# Resize the fiber pool by adding a new fiber.
55
- devices = self .sysman .ls .devices
56
- num_devices = len (devices )
57
- new_worker = self .sysman .ls .create_worker (
58
- f"{ self .name } -new-worker-{ self .__extra_fibers } "
59
- )
60
- self .__workers .append (new_worker )
61
-
62
- fiber = self .sysman .ls .create_fiber (
63
- new_worker , devices = [devices [self .size () % num_devices ]]
64
- )
65
- self .__fiber_pool .append (fiber )
66
- self .__extra_fibers += 1
67
- return [self .size () - 1 , fiber ]
68
-
69
- available_index = await self .__index_queue .get ()
70
- return (available_index , self .__fiber_pool [available_index ])
68
+ return self .resize ()
69
+
70
+ available_index = await self ._index_queue .get ()
71
+ return (available_index , self ._fiber_pool [available_index ])
71
72
72
73
def pool (self ) -> list [sf .Fiber ]:
73
- return self .__fiber_pool
74
+ return self ._fiber_pool
74
75
75
- def __initialize_pool (self ):
76
- devices = self .sysman .ls .devices
77
- num_devices = len (devices )
76
+ def _initialize_pool (self ):
78
77
for idx in range (self .init_size ):
79
78
worker = self .sysman .ls .create_worker (f"{ self .name } -init-worker-{ idx } " )
80
- self .__workers .append (worker )
81
-
82
- fiber = self .sysman .ls .create_fiber (
83
- worker , devices = [devices [idx % num_devices ]]
84
- )
85
- self .__fiber_pool .append (fiber )
79
+ self ._workers .append (worker )
80
+ fiber = self .sysman .ls .create_fiber (worker )
81
+ self ._fiber_pool .append (fiber )
86
82
assert idx < self .size ()
87
- self .__index_queue .put_nowait (idx )
83
+ self ._index_queue .put_nowait (idx )
88
84
89
85
def return_fiber (self , indices : int | list [int ]):
90
86
if not isinstance (indices , list ):
91
87
indices = [indices ]
92
88
for idx in indices :
93
- self .__index_queue .put_nowait (idx )
89
+ self ._index_queue .put_nowait (idx )
94
90
95
91
def size (self ) -> int :
96
- return len (self .__fiber_pool )
92
+ return len (self ._fiber_pool )
93
+
94
+
95
+ class DisaggregatedFiberPool (FiberPool ):
96
+ def __init__ (
97
+ self ,
98
+ sysman : LlmSystemManager ,
99
+ init_size : int ,
100
+ resizable : bool = True ,
101
+ name : str = "default-disagg-fiber-pool" ,
102
+ ):
103
+ super ().__init__ (
104
+ sysman = sysman ,
105
+ init_size = init_size ,
106
+ resizable = resizable ,
107
+ name = name ,
108
+ )
109
+
110
+ @override
111
+ def resize (self ):
112
+ devices = self .sysman .ls .devices
113
+ num_devices = len (devices )
114
+ new_worker = self .sysman .ls .create_worker (
115
+ f"{ self .name } -new-worker-{ self ._extra_fibers } "
116
+ )
117
+ self ._workers .append (new_worker )
118
+
119
+ fiber = self .sysman .ls .create_fiber (
120
+ new_worker , devices = [devices [self .size () % num_devices ]]
121
+ )
122
+ self ._fiber_pool .append (fiber )
123
+ self ._extra_fibers += 1
124
+ return [self .size () - 1 , fiber ]
125
+
126
+ @override
127
+ def _initialize_pool (self ):
128
+ devices = self .sysman .ls .devices
129
+ num_devices = len (devices )
130
+ for idx in range (self .init_size ):
131
+ worker = self .sysman .ls .create_worker (f"{ self .name } -init-worker-{ idx } " )
132
+ self ._workers .append (worker )
133
+
134
+ fiber = self .sysman .ls .create_fiber (
135
+ worker , devices = [devices [idx % num_devices ]]
136
+ )
137
+ self ._fiber_pool .append (fiber )
138
+ assert idx < self .size ()
139
+ self ._index_queue .put_nowait (idx )
0 commit comments