[Docs] Clean up benchmark_and_profiling.md (#4297)
Signed-off-by: windsonsea <haifeng.yao@daocloud.io>
This commit is contained in:
@@ -1,23 +1,32 @@
|
|||||||
# Benchmark and Profiling
|
# Benchmark and Profiling
|
||||||
|
|
||||||
## Benchmark
|
## Benchmark
|
||||||
|
|
||||||
- Benchmark the latency of running a single static batch without a server. The arguments are the same as for `launch_server.py`.
|
- Benchmark the latency of running a single static batch without a server. The arguments are the same as for `launch_server.py`.
|
||||||
Note that this is a simplified test script without a dynamic batching server, so it may run out of memory for a batch size that a real server can handle. A real server truncates the prefill into several batches, while this simplified script does not.
|
Note that this is a simplified test script without a dynamic batching server, so it may run out of memory for a batch size that a real server can handle. A real server truncates the prefill into several batches, while this simplified script does not.
|
||||||
```
|
|
||||||
|
```bash
|
||||||
python -m sglang.bench_one_batch --model-path meta-llama/Meta-Llama-3.1-8B-Instruct --batch 32 --input-len 256 --output-len 32
|
python -m sglang.bench_one_batch --model-path meta-llama/Meta-Llama-3.1-8B-Instruct --batch 32 --input-len 256 --output-len 32
|
||||||
```
|
```
|
||||||
|
|
||||||
- Benchmark offline processing. This script will start an offline engine and run the benchmark.
|
- Benchmark offline processing. This script will start an offline engine and run the benchmark.
|
||||||
```
|
|
||||||
|
```bash
|
||||||
python3 -m sglang.bench_offline_throughput --model-path meta-llama/Meta-Llama-3.1-8B-Instruct --num-prompts 10
|
python3 -m sglang.bench_offline_throughput --model-path meta-llama/Meta-Llama-3.1-8B-Instruct --num-prompts 10
|
||||||
```
|
```
|
||||||
|
|
||||||
- Benchmark online serving. Please use `sglang.launch_server` to launch a server first and run the following command.
|
- Benchmark online serving. Please use `sglang.launch_server` to launch a server first and run the following command.
|
||||||
```
|
|
||||||
|
```bash
|
||||||
python3 -m sglang.bench_serving --backend sglang --num-prompt 10
|
python3 -m sglang.bench_serving --backend sglang --num-prompt 10
|
||||||
```
|
```
|
||||||
|
|
||||||
## Profile with PyTorch Profiler
|
## Profile with PyTorch Profiler
|
||||||
Pytorch Profiler is a convenient basic tool to inspect kernel execution time, call stack, and kernel overlap and occupancy.
|
|
||||||
|
[Pytorch Profiler](https://pytorch.org/tutorials/recipes/recipes/profiler_recipe.html) is a convenient basic tool to inspect kernel execution time, call stack, and kernel overlap and occupancy.
|
||||||
|
|
||||||
- To profile a server
|
- To profile a server
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# set trace path
|
# set trace path
|
||||||
export SGLANG_TORCH_PROFILER_DIR=/root/sglang/profile_log
|
export SGLANG_TORCH_PROFILER_DIR=/root/sglang/profile_log
|
||||||
@@ -28,9 +37,11 @@ python -m sglang.launch_server --model-path meta-llama/Llama-3.1-8B-Instruct
|
|||||||
# send profiling request from client
|
# send profiling request from client
|
||||||
python -m sglang.bench_serving --backend sglang --model-path meta-llama/Llama-3.1-8B-Instruct --num-prompts 10 --sharegpt-output-len 100 --profile
|
python -m sglang.bench_serving --backend sglang --model-path meta-llama/Llama-3.1-8B-Instruct --num-prompts 10 --sharegpt-output-len 100 --profile
|
||||||
```
|
```
|
||||||
|
|
||||||
Please make sure that the `SGLANG_TORCH_PROFILER_DIR` should be set at both server and client side, otherwise the trace file cannot be generated correctly . A secure way will be setting `SGLANG_TORCH_PROFILER_DIR` in the `.*rc` file of shell (e.g. `~/.bashrc` for bash shells).
|
Please make sure that the `SGLANG_TORCH_PROFILER_DIR` should be set at both server and client side, otherwise the trace file cannot be generated correctly . A secure way will be setting `SGLANG_TORCH_PROFILER_DIR` in the `.*rc` file of shell (e.g. `~/.bashrc` for bash shells).
|
||||||
|
|
||||||
- To profile offline
|
- To profile offline
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export SGLANG_TORCH_PROFILER_DIR=/root/sglang/profile_log
|
export SGLANG_TORCH_PROFILER_DIR=/root/sglang/profile_log
|
||||||
python -m sglang.bench_offline_throughput --model-path meta-llama/Llama-3.1-8B-Instruct --dataset-name random --num-prompts 10 --profile --mem-frac=0.8
|
python -m sglang.bench_offline_throughput --model-path meta-llama/Llama-3.1-8B-Instruct --dataset-name random --num-prompts 10 --profile --mem-frac=0.8
|
||||||
@@ -39,21 +50,27 @@ python -m sglang.bench_offline_throughput --model-path meta-llama/Llama-3.1-8B-I
|
|||||||
- View Traces
|
- View Traces
|
||||||
|
|
||||||
Trace files can be loaded and visualized from:
|
Trace files can be loaded and visualized from:
|
||||||
|
|
||||||
1. https://ui.perfetto.dev/ (any browser)
|
1. https://ui.perfetto.dev/ (any browser)
|
||||||
2. chrome://tracing (Chrome browser only)
|
2. chrome://tracing (Chrome browser only)
|
||||||
|
|
||||||
If browser cannot open trace file due to its large size,
|
If browser cannot open trace file due to its large size,
|
||||||
client can generate a small trace file (<100MB) by controlling number of prompts and lengths of prompt outputs.
|
client can generate a small trace file (<100MB) by controlling number of prompts and lengths of prompt outputs.
|
||||||
For example, when profiling a server,
|
For example, when profiling a server,
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python -m sglang.bench_serving --backend sglang --model-path meta-llama/Llama-3.1-8B-Instruct --num-prompts 2 --sharegpt-output-len 100 --profile
|
python -m sglang.bench_serving --backend sglang --model-path meta-llama/Llama-3.1-8B-Instruct --num-prompts 2 --sharegpt-output-len 100 --profile
|
||||||
```
|
```
|
||||||
sets the number of prompts to 2 with `--num-prompts` argument and limits the length of output sequences to 100 with `--sharegpt-output-len` argument, which can generate a small trace file for browser to open smoothly.
|
|
||||||
|
This command sets the number of prompts to 2 with `--num-prompts` argument and limits the length of output sequences to 100 with `--sharegpt-output-len` argument, which can generate a small trace file for browser to open smoothly.
|
||||||
|
|
||||||
## Profile with Nsight
|
## Profile with Nsight
|
||||||
Nsight systems is an advanced tool that exposes more profiling details, such as register and shared memory usage, annotated code regions and low-level CUDA APIs and events.
|
|
||||||
|
|
||||||
0. Prerequisite: install using apt, or run inside a [NVIDIA Docker container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags) or [SGLang Docker container](https://github.com/sgl-project/sglang/tree/main/docker).
|
[Nsight systems](https://docs.nvidia.com/nsight-systems/) is an advanced tool that exposes more profiling details, such as register and shared memory usage, annotated code regions and low-level CUDA APIs and events.
|
||||||
|
|
||||||
|
1. Prerequisite:
|
||||||
|
|
||||||
|
Install using apt, or run inside a [NVIDIA Docker container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags) or [SGLang Docker container](https://github.com/sgl-project/sglang/tree/main/docker).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# install nsys
|
# install nsys
|
||||||
@@ -66,9 +83,13 @@ apt update
|
|||||||
apt install nsight-systems-cli
|
apt install nsight-systems-cli
|
||||||
```
|
```
|
||||||
|
|
||||||
1. To profile a single batch, use `nsys profile --trace-fork-before-exec=true --cuda-graph-trace=node python3 -m sglang.bench_one_batch --model meta-llama/Meta-Llama-3-8B --batch-size 64 --input-len 512`
|
2. To profile a single batch, use
|
||||||
|
|
||||||
2. To profile a server, e.g.
|
```bash
|
||||||
|
nsys profile --trace-fork-before-exec=true --cuda-graph-trace=node python3 -m sglang.bench_one_batch --model meta-llama/Meta-Llama-3-8B --batch-size 64 --input-len 512
|
||||||
|
```
|
||||||
|
|
||||||
|
3. To profile a server, e.g.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# launch the server, set the delay and duration times according to needs
|
# launch the server, set the delay and duration times according to needs
|
||||||
@@ -94,12 +115,13 @@ nsys stop --session=profile-XXXXX
|
|||||||
|
|
||||||
to manually kill the profiler and generate `nsys-rep` files instantly.
|
to manually kill the profiler and generate `nsys-rep` files instantly.
|
||||||
|
|
||||||
3. Use NVTX to annotate code regions, e.g. to see their execution time.
|
4. Use NVTX to annotate code regions, e.g. to see their execution time.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# install nvtx
|
# install nvtx
|
||||||
pip install nvtx
|
pip install nvtx
|
||||||
```
|
```
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# code snippets
|
# code snippets
|
||||||
import nvtx
|
import nvtx
|
||||||
@@ -108,7 +130,13 @@ with nvtx.annotate("description", color="color"):
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Other tips
|
## Other tips
|
||||||
|
|
||||||
1. You can benchmark a model using dummy weights by only providing the config.json file. This allows for quick testing of model variants without training. To do so, add `--load-format dummy` to the above commands and then you only need a correct `config.json` under the checkpoint folder.
|
1. You can benchmark a model using dummy weights by only providing the config.json file. This allows for quick testing of model variants without training. To do so, add `--load-format dummy` to the above commands and then you only need a correct `config.json` under the checkpoint folder.
|
||||||
2. You can benchmark a model with modified configs (e.g., less layers) by using `--json-model-override-args`. For example, you can benchmark a model with only 2 layers and 2 kv heads using `python -m sglang.bench_one_batch --model-path meta-llama/Meta-Llama-3.1-8B-Instruct --batch 32 --input-len 256 --output-len 32 --load-format dummy --json-model-override-args '{"num_hidden_layers": 1, "num_key_value_heads": 1}'`
|
2. You can benchmark a model with modified configs (e.g., less layers) by using `--json-model-override-args`. For example, you can benchmark a model with only 2 layers and 2 kv heads using:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m sglang.bench_one_batch --model-path meta-llama/Meta-Llama-3.1-8B-Instruct --batch 32 --input-len 256 --output-len 32 --load-format dummy --json-model-override-args '{"num_hidden_layers": 1, "num_key_value_heads": 1}'
|
||||||
|
```
|
||||||
|
|
||||||
3. You can use `--python-backtrace=cuda` to see python call stack for all CUDA kernels, as in PyTorch Profiler. (Caveat: this can cause inaccurately long kernel runtimes for CUDA event based timing)
|
3. You can use `--python-backtrace=cuda` to see python call stack for all CUDA kernels, as in PyTorch Profiler. (Caveat: this can cause inaccurately long kernel runtimes for CUDA event based timing)
|
||||||
4. For more args please see https://docs.nvidia.com/nsight-systems/UserGuide/index.html
|
4. For more arguments see [Nsight Systems User Guide](https://docs.nvidia.com/nsight-systems/UserGuide/index.html).
|
||||||
|
|||||||
Reference in New Issue
Block a user