Oneflow-Inc / one-codegeex

Apache License 2.0
7 stars 1 forks source link

codegeex-fastertransformer 测试结果 #8

Open marigoold opened 1 year ago

marigoold commented 1 year ago

环境:A100 - 40G 机器

测试步骤:

oneflow 和 torch 的测试方法见 https://github.com/Oneflow-Inc/one-codegeex/issues/8#issuecomment-1425528731

codegeex-fastertransformer测试结果:

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
BBuf commented 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++的模型实现里面最后一层应该已经同步了

marigoold commented 1 year ago

one-codegeex

如何测试:

测试结果: (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
marigoold commented 1 year ago

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
marigoold commented 1 year ago

合并 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
marigoold commented 1 year ago

合并 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
BBuf commented 1 year ago

eager下的性能最终结果:

图片

marigoold commented 1 year ago

经过沟通,发现之前的测试方法有问题。新的测试方法需要基于之前测试上继续修改:

修改后的 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
marigoold commented 1 year ago

同样地,按照 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
BBuf commented 1 year ago

图片

marigoold commented 1 year ago

one-codegeex

测试前的准备工作:

对于 PyTorch 版本的测试,也是相同的,只是把 ./scripts/test_inference_oneflow.sh 换成 ./scripts/test_inference.sh,修改文件时修改 torch 版本对应的文件即可。

ouyangyu commented 1 year ago

粗略的跑了下,关于codegeex-fastertransformer可能需要注意的几点:

  1. 直接python3 api.py --output_len 128应该是有问题的,因为 https://github.com/CodeGeeX/codegeex-fastertransformer/blob/a07a5830cc/api.py#L227-L232 这里input长度是4,而测试oneflow时候,应该是只有1个
  2. 可以使用 python3 api.py --output_len 2048启动服务后,采用python3 post.py来测试,可以得到一个时间。否则直接加循环是会报:[FT][ERROR] CUDA runtime error: an illegal memory access was encountered /data/home/ouyangyu/codegeex/codegeex-fastertransformer/src/fastertransformer/utils/memory_utils.cu:94等错误的

然后再测其他长度,python3 api.py --output_len 1024,python3 post.py重复十遍

  1. https://github.com/CodeGeeX/codegeex-fastertransformer/blob/a07a5830cc/post.py#L19-L21 对齐oneflow时候可能这几个参数要注意下。
ouyangyu commented 1 year ago

codegeex-fastertransformer

上述处理有问题。post.py里的max_seq_len参数其实是output_len参数

测试步骤:

  1. 通过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
  2. 在post.py里面增加一个args.output_len参数,使用命令时直接请求。

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。

可能需要使用这种方式测试。后续结果再同步。
ouyangyu commented 1 year ago

codegeex-fastertransformer

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
marigoold commented 1 year ago

加入 Warm Up 之后的 one-codegeex 测试结果:

@@ -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
BBuf commented 1 year ago

54.24

可以再把pytorch的数据补齐

ouyangyu commented 1 year ago

One-codegeex

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
  1. 直接使用one-codegeex分支测试,对比oneflow和pytorch
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
BBuf commented 1 year ago

图片

ouyangyu commented 1 year ago

NVIDIA A100-PCIE-40GB

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数据后面有时间我才能弄了,手里还有其他事。

liujuncheng commented 1 year ago

先出了一份测试报告。codegeex-fastertransformer的int8数据测了两次,都没能复现之前结果。可能需要重新安装环境测试。但也可以先以他们之前测的为准来做对比,这点跟对方说明一下即可。 复现int8数据后面有时间我才能弄了,手里还有其他事。

这个测试结果上面int8数据比较奇怪,我们需要先确认一下

Peterliwenxuan commented 1 year ago

codegeex-fastertransformer int8 测试

测试环境: NVIDIA A100-PCIE-40GB

操作步骤

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

问题:

ouyangyu commented 1 year ago

将api.py里的 https://github.com/CodeGeeX/codegeex-fastertransformer/blob/main/api.py#L227-L249 去掉。另外,自己创建一个新目录,在/data/home下,然后再挂载,再clone代码,一步步走一下。不要用我原来目录。

BBuf commented 1 year ago

one-codegeex记得用最新的main分支。

ouyangyu commented 1 year ago

NVIDIA A100-PCIE-40GB

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 都重测一次

Peterliwenxuan commented 1 year ago

测试步骤(详细版)

codegeex-fastertransformer

  1. 在/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)

  2. 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 编译文件

  3. 打开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)

  4. 修改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)

  5. 修改post.py 中prompt为 https://github.com/Oneflow-Inc/one-codegeex/blob/main/tests/test_prompt.txt 的内容

  6. 通过python3 api.py --output_len 2048 --ckpt_path /workspace/codegeex_13b_ft.pt --lib_path /workspace/codegeex-fastertransformer/build/lib/libth_codegeex.so 启动服务

  7. 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
  8. 结果保存在.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

one-codegeex

  1. 按照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__), '..')))
  2. 修改./tests/test_profile.txt 中内容为https://github.com/Oneflow-Inc/one-codegeex/blob/main/tests/test_prompt.txt 的内容

  3. 分别用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
  4. 结果为

    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
  5. 128长度下one-codegeex 的generated code都是空的,可能是新prompt无法输出这么短?