server.py 2.44 KB
Newer Older
Woosuk Kwon's avatar
Woosuk Kwon committed
1
2
3
import argparse
from typing import List

Woosuk Kwon's avatar
Woosuk Kwon committed
4
from cacheflow.master.frontend import Frontend
Woosuk Kwon's avatar
Woosuk Kwon committed
5
6
7
8
9
10
11
from cacheflow.master.scheduler import Scheduler
from cacheflow.worker.controller import Controller

parser = argparse.ArgumentParser(description='CacheFlow server')
parser.add_argument('--model', type=str, default='facebook/opt-125m', help='model name')
parser.add_argument('--num-nodes', type=int, default=1, help='number of nodes')
parser.add_argument('--num-workers', type=int, default=1, help='number of workers per node')
12
parser.add_argument('--block-size', type=int, default=8, choices=[8, 16], help='token block size')
Woosuk Kwon's avatar
Woosuk Kwon committed
13
14
# TODO(woosuk): Add an analytical model to determine the maximum number of GPU/CPU blocks.
parser.add_argument('--num-gpu-blocks', type=int, default=1024, help='number of GPU blocks (per GPU)')
15
16
17
parser.add_argument('--num-cpu-blocks', type=int, default=32, help='number of CPU blocks (per GPU)')
# NOTE(woosuk): If FlashAttention is used, the float data type is not supported.
parser.add_argument('--dtype', type=str, default='half', choices=['half', 'float'], help='data type')
Woosuk Kwon's avatar
Woosuk Kwon committed
18
args = parser.parse_args()
Woosuk Kwon's avatar
Woosuk Kwon committed
19
20
21


def main():
Woosuk Kwon's avatar
Woosuk Kwon committed
22
    # Create a controller for each node.
Woosuk Kwon's avatar
Woosuk Kwon committed
23
24
25
26
27
28
29
30
31
    controllers: List[Controller] = []
    for i in range(args.num_nodes):
        controller = Controller(
            node_id=i,
            num_workers=args.num_workers,
            model_name=args.model,
            block_size=args.block_size,
            num_gpu_blocks=args.num_gpu_blocks,
            num_cpu_blocks=args.num_cpu_blocks,
32
            dtype=args.dtype,
Woosuk Kwon's avatar
Woosuk Kwon committed
33
34
35
        )
        controllers.append(controller)

Woosuk Kwon's avatar
Woosuk Kwon committed
36
37
38
39
40
41
    # Create a frontend.
    frontend = Frontend(
        model_name=args.model,
        block_size=args.block_size,
    )

Woosuk Kwon's avatar
Woosuk Kwon committed
42
43
    # Create a scheduler.
    scheduler = Scheduler(
Woosuk Kwon's avatar
Woosuk Kwon committed
44
        frontend=frontend,
Woosuk Kwon's avatar
Woosuk Kwon committed
45
46
47
48
49
50
51
52
53
54
        controllers=controllers,
        block_size=args.block_size,
        num_gpu_blocks=args.num_gpu_blocks,
        num_cpu_blocks=args.num_cpu_blocks,
    )
    # Connect the controllers.
    for i in range(len(controllers) - 1):
        controllers[i].set_next(controllers[i + 1])
    controllers[-1].set_next(scheduler)

Woosuk Kwon's avatar
Woosuk Kwon committed
55
56
57
58
59
    test_inputs = [
        'Ion Stoica is a',
        'UC Berkeley is',
        'The future of cloud computing is',
    ]
Woosuk Kwon's avatar
Woosuk Kwon committed
60

Woosuk Kwon's avatar
Woosuk Kwon committed
61
62
    # FIXME
    while True:
Woosuk Kwon's avatar
Woosuk Kwon committed
63
64
        if test_inputs:
            frontend.query(test_inputs.pop())
Woosuk Kwon's avatar
Woosuk Kwon committed
65
        scheduler.step()
Woosuk Kwon's avatar
Woosuk Kwon committed
66
67
        if not scheduler.pending and not scheduler.running:
            break
Woosuk Kwon's avatar
Woosuk Kwon committed
68
69
70
71


if __name__ == '__main__':
    main()