Open marigoold opened 1 year ago
环境:A100 - 40G 机器
测试步骤:
* 按照 https://github.com/CodeGeeX/codegeex-fastertransformer 的 readme 方法安装 * 修改 api.py https://github.com/CodeGeeX/codegeex-fastertransformer/blob/a07a5830ccd104bd801b43cb9efdc19cbbd210ca/api.py#L108 ,注释掉这一行 exit(0) * 修改 api.py https://github.com/CodeGeeX/codegeex-fastertransformer/blob/a07a5830ccd104bd801b43cb9efdc19cbbd210ca/api.py#L156-L157 ,改为 ```python torch.cuda.synchronize() time2 = time.time() print("time used", time2 - time1) import os cmd = "nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv" os.system(cmd) exit(0) ``` * 运行脚本,`python3 api.py --output_len 128`,后面的数字对应 readme 中的 L,分别对 L=128/256/512/1024/2048 进行测试
测试结果: L Mem(MiB) Time(s) DataType 128 27917 3.07 fp16 256 28319 6.02 fp16 512 fp16 1024 fp16 2048 33951 59.45 fp16
fastertransformer那里不加同步应该也没问题,因为c++的模型实现里面最后一层应该已经同步了
one-codegeex
如何测试:
如果要测试不同的 output_len,可以在 scripts/test_oneflow_inference.sh 中增加一个参数,然后替换下方的 --out-seq-length 1024 中的 1024。修改后,在测试的脚本后面加上想要的 output_len 的值即可。
diff --git a/scripts/test_inference_oneflow.sh b/scripts/test_inference_oneflow.sh
index 939fb67..7c7762e 100644
--- a/scripts/test_inference_oneflow.sh
+++ b/scripts/test_inference_oneflow.sh
@@ -2,6 +2,7 @@
GPU=$1
PROMPT_FILE=$2
+OUTPUT_LEN=$3
SCRIPT_PATH=$(realpath "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
@@ -17,7 +18,8 @@ if [ -z "$GPU" ]; then
fi
export CUDA_HOME=/usr/local/cuda-11.1/
if [ -z "$PROMPT_FILE" ]; then
PROMPT_FILE=$MAIN_DIR/tests/test_prompt.txt
@@ -28,7 +30,7 @@ CMD="python $MAIN_DIR/tests/test_inference_oneflow.py \
--prompt-file $PROMPT_FILE \
--tokenizer-path $TOKENIZER_PATH \
--micro-batch-size 1 \
import os
cmd = "nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv"
os.system(cmd)
测试结果: (L 就是 output_len) | L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|---|
128 | 25613 | 0.52 | fp16 | |
256 | 25913 | 3.85 | fp16 | |
512 | 26633 | 10.61 | fp16 | |
1024 | 27691 | 25.62 | fp16 | |
2048 | 33101 | 60.44 | fp16 |
codegeex torch 1.13.0
测试方法同上。
测试结果:
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 25495 | 0.20 | fp16 |
256 | 25735 | 3.54 | fp16 |
512 | 26155 | 10.35 | fp16 |
1024 | 27631 | 24.63 | fp16 |
2048 | 33041 | 56.37 | fp16 |
合并 https://github.com/Oneflow-Inc/one-codegeex/pull/9 之后的测试结果(五次取平均):
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 25613 | 0.51 | fp16 |
256 | 25913 | 3.81 | fp16 |
512 | 26633 | 10.58 | fp16 |
1024 | 27691 | 25.62 | fp16 |
2048 | 33101 | 59.49 | fp16 |
合并 https://github.com/Oneflow-Inc/one-codegeex/pull/12 之后的结果(五次取平均):
结论:
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 26057 | 0.078 | fp16 |
256 | 26377 | 3.12 | fp16 |
512 | 27039 | 9.31 | fp16 |
1024 | 28135 | 22.11 | fp16 |
2048 | 33545 | 50.73 | fp16 |
eager下的性能最终结果:
经过沟通,发现之前的测试方法有问题。新的测试方法需要基于之前测试上继续修改:
修改后的 oneflow 测试结果(三次取平均,基于 edf4f2aecd37c197107a2c09bf0f648bec89d148):
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 25839 | 3.05 | fp16 |
256 | 26219 | 5.97 | fp16 |
512 | fp16 | ||
1024 | fp16 | ||
2048 | 33605 | 54.21 | fp16 |
同样地,按照 https://github.com/Oneflow-Inc/one-codegeex/issues/8#issuecomment-1425293429 中的做法修改了 torch 的测试流程,以下是结果(三次取平均):
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 3.49 | fp16 | |
256 | 6.95 | fp16 | |
512 | fp16 | ||
1024 | fp16 | ||
2048 | 61.92 | fp16 |
one-codegeex
测试前的准备工作:
如果要测试不同的 output_len,可以在 scripts/test_oneflow_inference.sh 中增加一个参数,然后替换下方的 --out-seq-length 1024 中的 1024。修改后,在测试的脚本后面加上想要的 output_len 的值即可。
diff --git a/scripts/test_inference_oneflow.sh b/scripts/test_inference_oneflow.sh
index 939fb67..7c7762e 100644
--- a/scripts/test_inference_oneflow.sh
+++ b/scripts/test_inference_oneflow.sh
@@ -2,6 +2,7 @@
GPU=$1
PROMPT_FILE=$2
+OUTPUT_LEN=$3
SCRIPT_PATH=$(realpath "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
@@ -17,7 +18,8 @@ if [ -z "$GPU" ]; then
fi
export CUDA_HOME=/usr/local/cuda-11.1/
if [ -z "$PROMPT_FILE" ]; then
PROMPT_FILE=$MAIN_DIR/tests/test_prompt.txt
@@ -28,7 +30,7 @@ CMD="python $MAIN_DIR/tests/test_inference_oneflow.py \
--prompt-file $PROMPT_FILE \
--tokenizer-path $TOKENIZER_PATH \
--micro-batch-size 1 \
import os
cmd = "nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv"
os.system(cmd)
echo "a" > ./test/test_profile.txt
之后的测试都用这个文件作为输入的 prompt。
对于 PyTorch 版本的测试,也是相同的,只是把 ./scripts/test_inference_oneflow.sh 换成 ./scripts/test_inference.sh,修改文件时修改 torch 版本对应的文件即可。
粗略的跑了下,关于codegeex-fastertransformer可能需要注意的几点:
python3 api.py --output_len 128
应该是有问题的,因为 https://github.com/CodeGeeX/codegeex-fastertransformer/blob/a07a5830cc/api.py#L227-L232 这里input长度是4,而测试oneflow时候,应该是只有1个然后再测其他长度,python3 api.py --output_len 1024,python3 post.py重复十遍
上述处理有问题。post.py里的max_seq_len参数其实是output_len参数
测试步骤:
nohup python3 api.py --ckpt_path /data/home/ouyangyu/codegeex/codegeex-fastertransformer/codegeex_13b_ft.pt > api_test.log 2>&1 &
启动服务。可以将参数打印出来,参考:https://github.com/Oneflow-Inc/OneAutoTest/blob/main/onebench/libai/extract_result.py#L36-L45
for((i=1;i<=10;i++));
do
python3 post.py --output_len 128 >> 128_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 256 >> 256_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 512 >> 512_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 1024 >> 1024_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
done
4. 统计request结果:
| L | Mem(MiB) | Time(s) | DataType |
| ---- | -------- | ------- | -------- |
| 128 | 33959MiB | 2.78 | fp16 |
| 256 | 33959MiB | 5.66 | fp16 |
| 512 | 33959MiB | 11.76 | fp16 |
| 1024 | 33959MiB | 25.2 | fp16 |
| 2048 | 33959MiB | 56.51 | fp16 |
这个结果与官方结果相差不大。https://github.com/CodeGeeX/codegeex-fastertransformer/blob/a07a5830cc/README.md#inference-performance
在显存上,由于启动时的output_len不同,导致显存不同,如使用`nohup python3 api.py --output_len 128 --ckpt_path /data/home/ouyangyu/codegeex/codegeex-fastertransformer/codegeex_13b_ft.pt`,然后使用 `python3 post.py --output_len 2048`来推理时候,显存会从27917MiB涨到29537MiB。
可能需要使用这种方式测试。后续结果再同步。
python3 api.py --output_len 128 --ckpt_path /data/home/ouyangyu/codegeex/codegeex-fastertransformer/codegeex_13b_ft.pt
启动服务python3 post.py --output_len 128、
python3 post.py --output_len 256、
python3 post.py --output_len 512、
python3 post.py --output_len 1024、
python3 post.py --output_len 2048`测试十次,取中位数L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 27925 MiB | 2.77433 | fp16 |
256 | 27925 MiB | 5.65564 | fp16 |
512 | 27925 MiB | 11.74733 | fp16 |
1024 | 28737 MiB | 25.15454 | fp16 |
2048 | 30349MiB | 56.46458 | fp16 |
加入 Warm Up 之后的 one-codegeex 测试结果:
加入 Warmup 的步骤: 重复 output_len 20次,修改部分计时代码(原来的方法中 times 是一个 dict,改成 list 来保存每次推理的时间)
diff --git a/tests/test_inference_oneflow.py b/tests/test_inference_oneflow.py
index fd15ffd..7833d5c 100644
--- a/tests/test_inference_oneflow.py
+++ b/tests/test_inference_oneflow.py
@@ -142,14 +142,17 @@ def main():
prompt = f.readlines()
prompt = "".join(prompt)
times = {}
out_seq_lengths = [args.out_seq_length]
times = []
out_seq_lengths = [args.out_seq_length] * 20
micro_batch_size = args.micro_batch_size seq_length = args.max_position_embeddings for out_seq_length in out_seq_lengths: print(f"Generating with out_seq_len {out_seq_length}...")
times[out_seq_length] = []
times.append([]) for prompt in [prompt]: t0 = time.perf_counter() tokens = tokenizer.encode_code(prompt) @@ -186,7 +189,8 @@ def main(): t1 = time.perf_counter() print("Total generation time:", t1 - t0, "# Tokens:", len(generatedtokens) - n_token_prompt) print(f"{(t1 - t0) / (len(generatedtokens) - n_token_prompt)}s/token")
times[out_seq_length].append(t1 - t0)
times[-1].append(t1 - t0)
print("================================= Generated code:")
print(generated_code)
@@ -194,9 +198,13 @@ def main(): break
print(times)
测试结果:
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 2.99 | fp16 | |
256 | 6.06 | fp16 | |
512 | 12.39 | fp16 | |
1024 | 25.48 | fp16 | |
2048 | 54.24 | fp16 |
54.24
可以再把pytorch的数据补齐
--temperature = 1、--top-p 1、--top-k 1
for prompt in [prompt]*10: # tests/test_inference.py
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 25485 MiB | 2.6075 | fp16 |
256 | 25885 MiB | 5.5713 | fp16 |
512 | 26505 MiB | 11.7806 | fp16 |
1024 | 27901 MiB | 24.638 | fp16 |
2048 | 33231 MiB | 52.75417 | fp16 |
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 25485 MiB | 2.5873 | fp16 |
256 | 25885 MiB | 5.5641 | fp16 |
512 | 26505 MiB | 11.7530 | fp16 |
1024 | 27901 MiB | 24.605 | fp16 |
2048 | 33231 MiB | 52.721 | fp16 |
L | Mem(MiB) | Time(s) | DataType |
---|---|---|---|
128 | 26283 MiB | 2.989 | fp16 |
256 | 26503 MiB | 6.3512 | fp16 |
512 | 27123 MiB | 13.298 | fp16 |
1024 | 28611 MiB | 27.8297 | fp16 |
2048 | 34009 MiB | 59.765 | fp16 |
L(DataType=FP16) | OneFlow[Mem(MiB)/Time(s)] | fastertransformer[Mem(MiB)/Time(s)] | PyTorch[Mem(MiB)/Time(s)] |
---|---|---|---|
128 | 25487 MiB / 2.58 | 27925 MiB / 2.9 | 26283 MiB / 2.9739 |
256 | 25847 MiB / 5.589 | 27925 MiB / 5.76 | 26503 MiB / 6.344 |
512 | 26447 MiB / 11.7235 | 27925 MiB / 11.87 | 27123 MiB / 13.248 |
1024 | 27903 MiB / 24.7416 | 28737 MiB / 25.30 | 28611 MiB / 28.0184 |
2048 | 33233 MiB / 52.75 | 30349 MiB / 56.61 | 34009 MiB / 60.236 |
L(DataType=INT8) | OneFlow[Mem(MiB)/Time(s)] | fastertransformer[Mem(MiB)/Time(s)] | PyTorch[Mem(MiB)/Time(s)] |
---|---|---|---|
128 | 17961 MiB / 2.224 | 15981 MiB / 8.9 | 14987 MiB / 8.298 |
256 | 18241 MiB / 4.8157 | 15981 MiB / 18.07 | 15187 MiB / 17.7768 |
512 | 18821 MiB / 10.065 | 15981 MiB / 36.35 | 15787 MiB / 36.9189 |
1024 | 20233 MiB / 21.393 | 16793 MiB / 37.91 | 16587 MiB / 75.736 |
2048 | 25537MiB / 46.289 | 18405 MiB / 37.89 | 18187 MiB / 156.6925 |
测试日志: oss://oneflow-test/OneAutoTest/onebench/codegeex/
先出了一份测试报告。codegeex-fastertransformer的int8数据测了两次,都没能复现之前结果。可能需要重新安装环境测试。但也可以先以他们之前测的为准来做对比,这点跟对方说明一下即可。 复现int8数据后面有时间我才能弄了,手里还有其他事。
先出了一份测试报告。codegeex-fastertransformer的int8数据测了两次,都没能复现之前结果。可能需要重新安装环境测试。但也可以先以他们之前测的为准来做对比,这点跟对方说明一下即可。 复现int8数据后面有时间我才能弄了,手里还有其他事。
这个测试结果上面int8数据比较奇怪,我们需要先确认一下
测试环境: NVIDIA A100-PCIE-40GB
操作步骤
按照https://github.com/CodeGeeX/codegeex-fastertransformer 安装,创建docker并运行,用提供的make_all.sh
进行编译,并按照comment中修改api.py (default —data_type
修改为int8)
启动docker并修改 —ckpt_path
和 —lib_path
为docker内地址 例如:nohup python3 [api.py](http://api.py/) --output_len 2048 --ckpt_path /workspace/codegeex-fastertransformer/codegeex_13b_ft.pt --lib_path /workspace/codegeex-fastertransformer/build/lib/libth_codegeex.so > api_test.log 2>&1 &
详细参数为
beam_search_diversity_rate ...................... 0.0
beam_width ...................................... 1
ckpt_path ....................................... /workspace/codegeex-fastertransformer/codegeex_13b_ft.pt
data_type ....................................... int8
end_id .......................................... 50256
head_num ........................................ 40
is_fix_random_seed .............................. False
layer_num ....................................... 40
len_penalty ..................................... 1.0
lib_path ........................................ /workspace/codegeex-fastertransformer/build/lib/libth_codegeex.so
max_batch_size .................................. 1
max_seq_len ..................................... 2048
output_len ...................................... 2048
pipeline_para_size .............................. 1
repetition_penalty .............................. 1.0
return_cum_log_probs ............................ 0
sample_input_file ............................... None
sample_output_file .............................. None
size_per_head ................................... 128
sparse .......................................... False
start_id ........................................ 50006
temperature ..................................... 1.0
tensor_para_size ................................ 1
time ............................................ False
top_k ........................................... 0
top_p ........................................... 1.0
vocab_size ...................................... 52224
python3 post.py --output_len 128 >> 128_post.log 测试不同长度(128, 256, 512, 1024, 2048)各十次并记录 测试脚本为
for((i=1;i<=10;i++));
do
python3 post.py --output_len 128 >> 128_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------128--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 256 >> 256_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------256--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 512 >> 512_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------512--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 1024 >> 1024_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------1024--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 2048 >> 2048_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------2048--------------------------"
done
测试结果为:
L(DataType=INT8) | Mem(MiB) | Time(s) |
---|---|---|
128 | 31952 | 1.7920149822235107 |
256 | 31952 | 3.6059526863098145 |
512 | 31952 | 7.567875885009766 |
1024 | 32764 | 7.973356801986694 |
2048 | 34376 | 7.918360067367554 |
官方结果为
L(DataType=INT8) | Time(s) |
---|---|
128 | 1.61 |
256 | 3.24 |
512 | 6.35 |
1024 | 14.32 |
2048 | 34.96 |
问题:
将api.py里的 https://github.com/CodeGeeX/codegeex-fastertransformer/blob/main/api.py#L227-L249 去掉。另外,自己创建一个新目录,在/data/home下,然后再挂载,再clone代码,一步步走一下。不要用我原来目录。
one-codegeex记得用最新的main分支。
One-codegeex commit : 7ba77b34387f50708b8c85d8dfcd08cbfde745e8
version: 0.9.1.dev20230311+cu117
git_commit: d3712f19
cmake_build_type: Release
rdma: True
mlir: True
L(DataType=FP16) | OneFlow[Mem(MiB)/Time(s)] | fastertransformer[Mem(MiB)/Time(s)] | PyTorch[Mem(MiB)/Time(s)] |
---|---|---|---|
128 | 25487 MiB / 2.5748 | 27925 MiB / 2.9 | 26283 MiB / 2.9739 |
256 | 25847 MiB / 5.555 | 27925 MiB / 5.76 | 26503 MiB / 6.344 |
512 | 26447 MiB / 11.651 | 27925 MiB / 11.87 | 27123 MiB / 13.248 |
1024 | 27903 MiB / 24.532 | 28737 MiB / 25.30 | 28611 MiB / 28.0184 |
2048 | 33233 MiB / 52.456 | 30349 MiB / 56.61 | 34009 MiB / 60.236 |
L(DataType=INT8) | OneFlow[Mem(MiB)/Time(s)] | fastertransformer[Mem(MiB)/Time(s)] | PyTorch[Mem(MiB)/Time(s)] |
---|---|---|---|
128 | 13619 MiB / 1.689 | 22015MiB / 1.851 | 14987 MiB / 8.298 |
256 | 13899 MiB / 3.606 | 22015MiB / 3.732 | 15187 MiB / 17.7768 |
512 | 14439 MiB / 7.635 | 22015MiB / 7.83 | 15787 MiB / 36.9189 |
1024 | 15855 MiB / 16.238 | 22015 MiB / 17.243 | 16587 MiB / 75.736 |
2048 | 21057 MiB / 35.975 | 22015 MiB / 37.527 | 18187 MiB / 156.6925 |
ps: 关于fastertransformer在int8情况下512后时间不变的原因找到了,具体是因为输入的原因,https://github.com/CodeGeeX/codegeex-fastertransformer/blob/main/post.py#L12 。将这里修改成https://github.com/Oneflow-Inc/one-codegeex/blob/main/tests/test_prompt.txt 这个文件的内容即可。
因上述oneflow和pytorch用的\# language: python\n# write a quick sort function\ndef
测试的,因此上述表格麻烦 @Peterliwenxuan 都重测一次
在/data/home/自己的目录下运行
docker pull nvcr.io/nvidia/pytorch:21.11-py3
docker run -p 9114:5000 --cpus 12 --gpus '"device=0"' -it -v <WORK_DIR>:/workspace/codegeex-fastertransformer --ipc=host --name=test nvcr.io/nvidia/pytorch:21.11-py3
(其中name改为container的名字,下次测试可以通过docker exec -it <container-name/ID> bash
进入docker)
Clone项目
git clone https://github.com/CodeGeeX/codegeex-fastertransformer.git
并将模型复制一个到目录下
docker cp ./codegeex_13b_ft.pt [container_id]:/workspace/
(这个命令是在bash下执行不是在container里)
在docker中进入目录
cd codegeex-fastertransformer
更换pip默认源 python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装相关包
pip3 install transformers pip3 install sentencepiece
通过sh make_all.sh
编译文件
打开api.py
在最上方import os
L49 —lib_path 的default改为'/workspace/codegeex-fastertransformer/build/lib/libth_codegeex.so'
L61 —data_type 的default改为'int8'
L101 前加入
"""Print arguments."""
print("------------------------ arguments ------------------------", flush=True)
str_list = []
for arg in vars(args):
dots = "." * (48 - len(arg))
str_list.append(" {} {} {}".format(arg, dots, getattr(args, arg)))
for arg in sorted(str_list, key=lambda x: x.lower()):
print(arg, flush=True)
print("-------------------- end of arguments ---------------------", flush=True)
L168 改为
cmd = "nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv"
os.system(cmd)
print(" process_code time used", time2 - time1)
删除L227-L249
inputs = [
"# language: Python\n# write a quick sort function\ndef",
"# language: Python\n# write a quick sort function\n",
"# language: Python\n# write a bubble sort function\ndef",
"# language: Python\n# write a merge sort function\ndef",
]
outputs = process_code(
contexts=inputs,
output_len=output_len,
top_k=top_k,
top_p=top_p,
temperature=temperature,
repetition_penalty=repetition_penalty,
end_tokens=['<|endoftext|>'],
)
for i, output in enumerate(outputs):
print(f"========= Generation {i} =========")
print(f"=== Context:\n{output['context']}")
print(f"=== Generated:\n{output['generated']}")
print(f"=== Combined:\n{output['context'] + output['generated']}")
L243 选择自己的port(这里使用8000):
app.run('0.0.0.0',port=8000)
修改post.py
最上方import argparse
L14 加入
parser = argparse.ArgumentParser()
parser.add_argument('--output_len', type=int, default=2048,
help='output sequence length to generate.')
args = parser.parse_args()
L27 将max_seq_len 改为 args.output_len
L37 改为 print("request time used",time2-time1)
修改post.py 中prompt为 https://github.com/Oneflow-Inc/one-codegeex/blob/main/tests/test_prompt.txt 的内容
通过python3 api.py --output_len 2048 --ckpt_path /workspace/codegeex_13b_ft.pt --lib_path /workspace/codegeex-fastertransformer/build/lib/libth_codegeex.so
启动服务
touch run.sh 创建脚本,内容为:
for((i=1;i<=10;i++));
do
python3 post.py --output_len 128 >> 128_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------128--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 256 >> 256_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------256--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 512 >> 512_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------512--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 1024 >> 1024_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------1024--------------------------"
done
sleep 20s
for((i=1;i<=10;i++));
do
python3 post.py --output_len 2048 >> 2048_post.log
nvidia-smi --query-gpu=timestamp,name,driver_version,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv
echo "------------------------2048--------------------------"
done
结果保存在.log文件中
L(DataType=INT8) | Mem(MiB) | Time(s) |
---|---|---|
128 | 19159 | 1.843024235107 |
256 | 19159 | 3.737963098145 |
512 | 19159 | 6.647825009766 |
1024 | 19159 | 17.63568019866 |
2048 | 19159 | 35.28367367554 |
官方结果为
L(DataType=INT8) | Time(s) |
---|---|
128 | 1.61 |
256 | 3.24 |
512 | 6.35 |
1024 | 14.32 |
2048 | 34.96 |
按照https://github.com/Oneflow-Inc/one-codegeex/issues/8#issuecomment-1425528731安装并修改文件,用conda创建一个新的python3.7环境 按照https://github.com/Oneflow-Inc/one-codegeex/issues/8#issuecomment-1426793843修改参数。
配置环境时遇到了importError的问题,加入如下代码后解决(不知道是不是都有这个问题)
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
修改./tests/test_profile.txt
中内容为https://github.com/Oneflow-Inc/one-codegeex/blob/main/tests/test_prompt.txt 的内容
分别用fp32,int8参数(在/configs/codegeex_13b.sh中修改)跑脚本
for value in 128 256 512 1024 2048
do
bash scripts/test_inference.sh $value 2>&1 | tee ${value}_fp32_torch.log
sleep 60s
done
for value in 128 256 512 1024 2048
do
bash scripts/test_inference_oneflow.sh $value 2>&1 | tee ${value}_fp32_oneflow.log
sleep 60s
done
结果为
L(DataType=FP16) | OneFlow[Mem(MiB)/Time(s)] | PyTorch[Mem(MiB)/Time(s)] | fastertransformer[Mem(MiB)/Time(s)] |
---|---|---|---|
128 | 25687/0.039 | 26137/0.056 | 26892/2.832 |
256 | 25987/3.035 | 26231/4.364 | 26892/5.421 |
512 | 26707/9.158 | 27194/9.934 | 26892/11.236 |
1024 | 27763/21.968 | 28654/24.382 | 28932/25.541 |
2048 | 33093/50.033 | 34028/58.842 | 30294/56.203 |
L(DataType=INT8) | OneFlow[Mem(MiB)/Time(s)] | PyTorch[Mem(MiB)/Time(s)] | fastertransformer[Mem(MiB)/Time(s)] |
---|---|---|---|
128 | 12217/0.054 | 13259/0.041 | 19159/1.843 |
256 | 13723/2.982 | 14923/11.238 | 19159/3.737 |
512 | 14212/8.945 | 15923/33.214 | 19159/6.647 |
1024 | 15823/17.323 | 17322/71.532 | 19159/17.635 |
2048 | 22038/41.963 | 20938/134.620 | 19159/35.283 |
128长度下one-codegeex 的generated code都是空的,可能是新prompt无法输出这么短?
环境:A100 - 40G 机器
测试步骤:
python3 api.py --output_len 128
,后面的数字对应 readme 中的 L,分别对 L=128/256/512/1024/2048 进行测试oneflow 和 torch 的测试方法见 https://github.com/Oneflow-Inc/one-codegeex/issues/8#issuecomment-1425528731
codegeex-fastertransformer测试结果: