Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

construct mlperf qGPT-J evaluation #16

Conversation

deeplearningfromscratch
Copy link
Collaborator

@deeplearningfromscratch deeplearningfromscratch commented Mar 27, 2024

qGPT-J 재현 instruction 에 따라 환경을 구성했습니다.

w/o calibration 검증

아래와 같이 결과 확인하여 검증 완료하였습니다.

our result reference accuracy
ROUGE1 43.0470 (100.14%) 42.9865
ROUGE2 20.1573 (100.17%) 20.1235
ROUGEL 30.0462 (100.19%) 29.9881
GEN_LEN 3971863 (98.88%) 4016878

w/ calibration 검증

이슈: #17 에 따라 w/ calibration 검증은 하지 못했습니다.
다만, 아래의 방법과 같이 A100 GPU 에서 계산한 qparam 이 동일한 것은 확인하였습니다.
quant_param 동일 여부 확인 코드

import numpy as np


a100_qparam = np.load("qparam_Qlevel4_RGDA0-W8A8KV8-PTQ-SMQ-A100.npy", allow_pickle=True).item()
my_qparam = np.load("logs/qgpt-j/Offline/20240329_052442UTC/calibration_range/quant_param.npy", allow_pickle=True).item()

x = a100_qparam
y = my_qparam

x_keys = list(x.keys())
y_keys = list(y.keys())
print(all(x_keys[i] == y_keys[i] for i in range(len(x_keys))))

keys = x_keys
sub_keys = ['amax', 'max', 'min', 'amax_outlier', 'max_outlier', 'min_outlier', 'basis', 'scale_per_channel', 'scale_per_channel_outlier', 'clipping_bound', 'outlier_cin_idx', 'ch']

print(all(np.array_equal(x[k][sk], y[k][sk]) for k in keys for sk in sub_keys))

추가 실험)
아래는 A100 에서 calibration 및 evaluation 한 결과입니다. 모든 ROUGE score 가 H100 한 calibration 결과보다 근소하게 떨어지는 결과를 확인했습니다. 그러나 그 수준은 99.9% 는 상회하는 것을 확인했습니다.

our result reference accuracy
ROUGE1 43.032 (100.11%) 42.9865
ROUGE2 20.1222 (99.99%) 20.1235
ROUGEL 30.0342 (100.15%) 29.9881
GEN_LEN 3973352 (98.92%) 4016878

@deeplearningfromscratch deeplearningfromscratch force-pushed the mlperf-qgpt-j branch 2 times, most recently from f9cbc3f to 0e66041 Compare March 28, 2024 08:40
@deeplearningfromscratch deeplearningfromscratch changed the title mlperf qGPT-J evaluation construct mlperf qGPT-J evaluation Mar 29, 2024
Copy link
Member

@hyunsik hyunsik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생 많으셨습니다. 몇 가지 코멘트 드렸습니다.

README.md Outdated Show resolved Hide resolved
README.md Outdated Show resolved Hide resolved
Makefile Outdated Show resolved Hide resolved
language/gpt-j/main.py Show resolved Hide resolved
language/gpt-j/quantization/__init__.py Show resolved Hide resolved
@dkim-furiosa
Copy link

dkim-furiosa commented Apr 13, 2024

PR #12 머지되면 그 PR 리뷰에 따른 변경들을 이 PR에도 적용 부탁드립니다.

@deeplearningfromscratch
Copy link
Collaborator Author

deeplearningfromscratch commented Apr 16, 2024

A6000 에서 아래 두 commit 에서 실행하여 리뷰 반영한 commit 들에 의한 accuracy 변화가 없는 것을 확인했습니다. cc: @dkim-furiosa

a9bed81 1000 calib 10 eval

Save eval log to /home/furiosa/workspace/jason/inference/logs/qgpt-j/Offline/20240416_162155KST
{'rouge1': 31.9891, 'rouge2': 12.4547, 'rougeL': 22.7843, 'rougeLsum': 31.6716, 'gen_len': 1939, 'gen_num': 10}
Finished destroying QSL.

c704929 1000 calib 10 eval

Save eval log to /home/furiosa/workspace/jason/inference/logs/qgpt-j/Offline/20240416_171748KST
{'rouge1': 31.9891, 'rouge2': 12.4547, 'rougeL': 22.7843, 'rougeLsum': 31.6716, 'gen_len': 1939, 'gen_num': 10}
Finished destroying QSL.

@dkim-furiosa
Copy link

정래 님, 이 PR에 #12#19 리뷰에 따른 변경들이 다 반영되어 있는 상태인가요?

@deeplearningfromscratch
Copy link
Collaborator Author

deeplearningfromscratch commented Apr 23, 2024

#19 에서 적용하였던 639980eaa05f6e 와 같이 변경 하였습니다.

-      if k in params and params[k].annotation == Optional[type(v)]
+      if k in params
+        and any(params[k].annotation == x for x in [type(v), Optional[type(v)]])

아래의 config 들은 각 commit 에서 출력한 아래 함수들의 인자들입니다.

  • model_compressor.create_quantsim_model
  • model_compressor.calibrate
  • model_compressor.save

aa05f6e

    {'act_calib_method': 'MINMAX_ASYM', 'act_dtype': 'int8', 'act_granularity': 'channel', 'act_nbits': 8, 'target_machine': 'RGDA0', 'weight_calib_method': 'AMAX_SYM', 'weight_dtype': 'int8', 'weight_granularity': 'channel', 'weight_nbits': 8, 'qlevel': 4, 'kv_dtype': 'int8', 'act_zp_equalizing': 'linear_all'}
    {'act_calib_method': 'MINMAX_ASYM', 'act_dtype': 'int8', 'act_granularity': 'channel', 'act_nbits': 8, 'percentile': 99.9, 'target_machine': 'RGDA0', 'weight_calib_method': 'AMAX_SYM', 'weight_dtype': 'int8', 'weight_granularity': 'channel', 'weight_nbits': 8, 'kv_dtype': 'int8', 'autoscale': 'SmoothQuant', 'autoscale_calib_method': 'auto', 'act_zp_equalizing': 'linear_all'}
    {'act_calib_method': 'MINMAX_ASYM', 'act_dtype': 'int8', 'act_granularity': 'channel', 'act_nbits': 8, 'weight_calib_method': 'AMAX_SYM', 'weight_dtype': 'int8', 'weight_granularity': 'channel', 'weight_nbits': 8}

639980e

    {}
    {}
    {'act_calib_method': 'MINMAX_ASYM', 'act_dtype': 'int8', 'act_granularity': 'channel', 'act_nbits': 8, 'weight_calib_method': 'AMAX_SYM', 'weight_dtype': 'int8', 'weight_granularity': 'channel', 'weight_nbits': 8}

결론적으로, aa05f6e
와 같이 오류를 바로 잡습니다. 이 변경 사항은 qbert 에도 적용되어야 합니다.

@dkim-furiosa
Copy link

#19 (comment)

인자들의 타입이 전부 Optional인가요?

음, 논의가 좀 헛도는 것 같네요. 😢 위 질문에 예/아니오라고 먼저 답해주세요.

@deeplearningfromscratch
Copy link
Collaborator Author

맥락상 params[k].annotation == type(v) | None 를 처리 대상이 되는 인자들의 타입이 전부 Optional 이냐고 이해했고,
"네" 라는 맥락에서 #19 (comment) 와 같이 답변을 드린 것입니다.
params[k].annotation == type(v) 까지 포함하여 모든 인자들이 Optional 타입이냐고 하면 "아니오" 입니다.

이 부분에서 혼선이 있었던 것 같습니다.

@deeplearningfromscratch
Copy link
Collaborator Author

deeplearningfromscratch commented Apr 23, 2024

aa05f6e 적용하여 A6000 에서 1000 calib 10 eval 에서 확인한 결과 accuracy 변화 없는 것으로 확인했습니다.

Save eval log to /home/furiosa/workspace/jason/inference/logs/qgpt-j/Offline/20240423_105634KST
{'rouge1': 31.9891, 'rouge2': 12.4547, 'rougeL': 22.7843, 'rougeLsum': 31.6716, 'gen_len': 1939, 'gen_num': 10}
Finished destroying QSL.

@dkim-furiosa
Copy link

그렇군요. 사용하는 파이썬 버전이 3.10 이상인가요?

@deeplearningfromscratch
Copy link
Collaborator Author

그렇군요. 사용하는 파이썬 버전이 3.10 이상인가요?

네 맞습니다. https://github.com/deeplearningfromscratch/inference/blob/mlperf-qgpt-j/scripts/envs/qgpt-j_env.yml#L5

@dkim-furiosa
Copy link

질문 한 가지 더 드립니다. 패라미터에 타입 힌트가 주어지지 않은 경우는 고려하지 않아도 되나요?

@deeplearningfromscratch
Copy link
Collaborator Author

deeplearningfromscratch commented Apr 23, 2024

질문 한 가지 더 드립니다. 패라미터에 타입 힌트가 주어지지 않은 경우는 고려하지 않아도 되나요?

네 맞습니다. 타입 힌트가 주어지지 않는 경우가 없습니다.
호출되는 함수들의 인자들은 아래와 같습니다.

language/gpt-j/main.py Outdated Show resolved Hide resolved
language/gpt-j/main.py Outdated Show resolved Hide resolved
language/gpt-j/main.py Outdated Show resolved Hide resolved
Comment on lines 35 to 38
super().__init__(quant_model.config)
self.quant_model = quant_model
self.config = quant_model.config

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
self.model_type = model_type
super().__init__(quant_model.config)
self.quant_model = quant_model
self.config = quant_model.config
super().__init__(quant_model.config)
self.quant_model = quant_model
self.config = quant_model.config
self.model_type = model_type

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super().__init__(quant_model.config) 에서 self.model_type 을 호출하게 되어 있습니다.
변경 사항과 같이 고치게되면 아래와 같은 에러가 발생하는 것으로 확인됩니다.

Traceback (most recent call last):
  File "/home/furiosa/miniconda3/envs/mlperf-qgpt-j/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/home/furiosa/miniconda3/envs/mlperf-qgpt-j/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/furiosa/workspace/jason/inference/language/gpt-j/main.py", line 118, in <module>
    main()
  File "/home/furiosa/workspace/jason/inference/language/gpt-j/main.py", line 83, in main
    sut.model = quantize_model(sut.model, args.quant_config_path, args.quant_param_path, args.quant_format_path)
  File "/home/furiosa/workspace/jason/inference/language/gpt-j/quantization/__init__.py", line 30, in quantize_model
    return QuantPreTrainedModel(model, model_type, input_names, concrete_args)
  File "/home/furiosa/workspace/jason/inference/language/gpt-j/quantization/__init__.py", line 35, in __init__
    super().__init__(quant_model.config)
  File "/home/furiosa/miniconda3/envs/mlperf-qgpt-j/lib/python3.10/site-packages/transformers/modeling_utils.py", line 1101, in __init__
    self.generation_config = GenerationConfig.from_model_config(config) if self.can_generate() else None
  File "/home/furiosa/workspace/jason/inference/language/gpt-j/quantization/__init__.py", line 43, in can_generate
    return self.model_type.can_generate()
  File "/home/furiosa/miniconda3/envs/mlperf-qgpt-j/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1695, in __getattr__
    raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'")
AttributeError: 'QuantPreTrainedModel' object has no attribute 'model_type'

Copy link

@dkim-furiosa dkim-furiosa Apr 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

부모 클래스가 추상 클래스가 아닌데 부모 클래스 생성자를 부를 때 특정 필드가 존재하길 기대하는 일은 드뭅니다. 이런 경우를 만나면 자기의 이해와 코드를 다시 한 번 점검해야 하겠습니다. 당장 can_generate() 메소드는 원래 클래스 메소드입니다: https://github.com/huggingface/transformers/blob/9fe3f585bb4ea29f209dc705d269fbe292e1128f/src/transformers/modeling_utils.py#L1506-L1518 반면, 아래에서 일반 메소드로 정의하고 있습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cd1ab9e 반영했습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

별도 PR 에서 QuantPreTrainedModel rewrite 하겠습니다.

language/gpt-j/quantization/__init__.py Outdated Show resolved Hide resolved
language/gpt-j/quantization/__init__.py Outdated Show resolved Hide resolved
language/gpt-j/quantization/calibrate.py Outdated Show resolved Hide resolved
language/gpt-j/quantization/calibrate.py Outdated Show resolved Hide resolved
language/gpt-j/quantization/calibrate.py Outdated Show resolved Hide resolved
language/gpt-j/quantization/utils.py Outdated Show resolved Hide resolved
Copy link

@dkim-furiosa dkim-furiosa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다~

@deeplearningfromscratch deeplearningfromscratch merged commit 0f2a4cd into furiosa-ai:mlperf-qgpt-j Apr 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants