서론

kiqu 2.4bpw 모델을 돌려봤습니다만, 생각보다 좋은 결과가 안나왔었어요. (지금 생각해보면 설정의 문제였지 싶습니다.)

하츠네 미쿠는 누구인가?
"하츠네 미쿠"라는 이름은 일본의 만화나 애니메이션, 게임, 소설 등에서 많이 사용되는 단어로, 특정한 인물을 지칭하는 것보다는 일종의 개념으로 자주 언급됩니다. '하츠네'는 '귀여운', '아기'를 의미하고, '미쿠'는 '코끼리'를 뜻합니다. 그런데도 불구하고 이 두 단어를 조합해서 '귀여운 코끼리'라는 의미로 해석하면 맥록스(Macaque)라는 동물을 의미합니다. 그러나, 대부분 일본에서는 이 명칭이 마치 귀여운 유머 캐릭터를 상상하게 하므로, 어떤 경우에는 '귀여운' 아이나 동물을 비유하는 데 사용되기도 합니다.



그래서 RTX4090에 PC에서 쓰는 RTX4070을 붙여서 더 높은(?) 양자화 모델을 돌려보고 싶었습니다만,

PCIe 버전이라거나 파워 최대 전력이라거나 문제로 못하고 있었습니다.

그러던 와중에 eGPU를 통한 거대 매개변수 LLM 구동기를 읽고 eGPU를 달아보기로 했습니다.


OCuLink?

eGPU 정보를 얻기 위해 커뮤니티를 돌아다니다 OCuLink를 이용한 eGPU 구성법을 찾게 되었습니다.

저렴하면서도 M.2 컨버터를 이용해 쓸 수 있어 썬더볼트에 비해 제약이 적어

미니PC나 노트북용 eGPU 구성에 많이 사용되고 있었습니다.


OCuLink는 Optical-Copper Link를 뜻하고 썬더볼트에 대항해 나온 PCIe 규격이라고 합니다.

최대 PCIe 4.0 x8 (약 16GB/s)까지 지원하고, 주로 서버에서 사용하는 규격이라네요. *위키페디아

SATA-eSATA 관계와 같이 PCIe를 단순 변환하는 거라 구조가 간단하고 PCIe 성능을 최대한 활용할 수 있는 것 같았습니다.



구입 및 설치

알리에서 50달러 근처에 판매하기에 일단 구입했습니다.


eGPU 구성을 위해서는 PCIe 슬롯이 달린 본체와 M.2 어댑터를 OCuLink 케이블로 연결하고,

본체에 GPU와 PSU를 연결해야 합니다.


제 4090의 메인보드가 B660 칩셋이라 PCIe x4 슬롯은 PCIe 3.0 밖에 지원하지 않습니다만,

다행히 M.2 슬롯은 PCIe 4.0을 지원했습니다. 어댑터는 CPU lane을 사용하는 PCI16_1 위쪽 슬롯을 이용했습니다.


RTX3060 12GB
RTX3090


PC에 달린 4070을 사용할랬는데, 저도 모르는 사이에 3060과 3090이 손에 들려 있었습니다.


파워는 모듈러 중에 가장 저렴한 걸 구입했습니다.

사고나서 후회하는 게 700W나 되지만 6+2핀이 2개(y케이블로 총4개) 밖에 없고 12VHPWR도 지원하지 않습니다ㅠㅠ

(하지만 저렴했죠.)


사용은 PC를 끈 다음 eGPU를 OCuLink 케이블로 연결하고 PC를 켜면 됩니다.

USB나 썬더볼트와 달리 핫플러그를 지원하지 않습니다.

제가 구입한 기기는 전원이 연동되었습니다만, 기기에 따라 연동이 안되어 직접 켜야하는 제품도 있었습니다.

이 경우 eGPU의 전원을 먼저 켠 후 PC를 켜야 합니다.


저는 리눅스로 구동해서 별 이슈가 없었지만, 윈도에서는 43에러가 발생할 수 있다고 합니다.

이 때는 아래 스크립트를 써보시기 바랍니다.

https://egpu.io/forums/expresscard-mpcie-m-2-adapters/script-nvidia-error43-fixer/



추론속도

kiqu 2.4bpw와 3.0bpw를 gpu-split을 달리하여 테스트 해보았습니다.


환경

  • 12600K + DDR4 64GB + Ubuntu 22.04 + Textgen webui
  • RTX4090 과 RTX3090 은 300W로 전력 제한


kiqu 70b 2.4 / max_seq_len 4096 / cache_8bit


Device / gpu-split
NONE18,1012,10
memT/smemT/smemT/s
4090 + 3060(oculink)
PCIe4.0 x16+x4
22158MiB/182MiB34.7817528MiB/5520MiB25.0813316MiB/9728MiB19.07
4090 + 3090(oculink)
PCIe4.0 x16+x4
22158MiB/0MiB34.2419736MiB/3450MiB33.3613286MiB/9898MiB31.56


RTX3060과 사용 시 3060의 VRAM에 많이 할당할수록 속도 저하가 있었습니다.

RTX3090과 사용 시에는 속도 저하가 크지 않았습니다. 다만, 짧게 테스트한거라 컨텍스트가 늘어나면 어떻게 될 지 모르겠네요.


kiqu 70b 3.0 / max_seq_len 16384 / cache_8bit


Device / gpu-split
20,1018,1016,12
memT/smemT/smemT/s
4090 + 3060(oculink)
PCIe4.0 x16+x4
23150MiB/6658MiB20.9420688MiB/9114MiB18.6218590MiB/11212MiB16.82
4090 + 3090(oculink)
PCIe4.0 x16+x4
23120MiB/6818MiB27.5420676MiB/9268MiB26.8518580MiB/11366MiB26.89
3090 + 3060
PCIe3.0 x8+x8
22966MiB/6626MiB18.1520534MiB/9100MiB16.6718436MiB/11200MiB15.24


2.4bpw 때와 마찬가지로 RTX3060과 함께 사용할 경우 속도 저하가 컸으며 RTX3090는 생각보다 크지 않았습니다.


덤으로 Ryzen 5600G + X570 + DDR4 64GB + 3090+3060 x8+x8 환경으로도 동일한 테스트를 해보았습니다만,

환경도 다르고 GPU구성도 달라 비교는 어렵습니다.

다만, 4090+3060과 3090+3060의 속도 차가 크지 않은 점은 예상 외였습니다.

PCIe3.0 x8+x8은 PCIe4.0 x4+x4과 비슷한 대역폭을 가지고 있는 점을 생각하면 더욱 그렇습니다.



학습속도

아직 LLM 학습을 경험해보지 못한 관계로 제대로 된 테스트 방법을 떠올리지 못했습니다.

이 때문에 transformers 예제의 벤치마크를 돌려보았습니다.

https://huggingface.co/docs/transformers/perf_train_gpu_many#dataparallel-vs-distributeddataparallel


테스트는 "3090 nvlink 테스트 해봤습니다." 게시글을 참고하였습니다.


환경

  • 추론 테스트와 동일 하드웨어에서 4090 + 3090 만 테스트 진행하였습니다.


DP

rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 python examples/pytorch/language-modeling/run_clm.py --model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 --do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{

    "epoch": 0.69,

    "train_loss": 3.292188720703125,

    "train_runtime": 147.3958,

    "train_samples": 2318,

    "train_samples_per_second": 10.855,

    "train_steps_per_second": 1.357

}


147초가 나왔고, 4090이 놀고 있는 것을 그래프로 확인할 수 있었습니다.

참고한 게시물의 3090+3090보다 느린 것은 의외인데 대역폭의 문제이거나 CPU, RAM등 다른 구성의 문제일 수 있을 것 같습니다.


DDP

rm -r /tmp/test-clm; NCCL_P2P_DISABLE=1 NCCL_IB_DISABLE=1 CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py --model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 --do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{

    "epoch": 0.69,

    "train_loss": 3.3025408935546876,

    "train_runtime": 84.5797,

    "train_samples": 2318,

    "train_samples_per_second": 18.917,

    "train_steps_per_second": 2.365

}


총 84초가 걸렸고, 속도 자체는 참고한 글 3090+3090과 비교 시,

3090x2 nvlink > 4090 + 3090 > 3090x2

정도였습니다. (다만 환경이 다르므로 참고만 부탁합니다.)


3090이 시작하고 얼마 안되 83도를 넘으면서 팬이 100%로 돌고 쓰로틀링에 걸리는 느낌이었습니다.

중고란 점을 감안해도 4090 대비 온도가 너무 높네요.

전력소모도 4090과 달리 3090은 리밋을 꽉 채웁니다. 이건 병목 때문일 수도 있겠네요.


때문에 3090의 전력 제한을 달리해서도 테스트 해보았습니다.

전력제한학습속도
300W84.5797
280W87.109
250W95.875

280W일 때는 후반부에 83도를 찍으며 팬이 100%로 돌았고,

250W에서는 75~80도를 찍으며 팬이 순간순간 100%를 찍었습니다. 다만, 250W일 때는 속도 저하가 꽤 크네요.

써멀 교체 AS를 맡겨봐야 될 것 같습니다.



장/단점

장점

  • 기존의 시스템 변경없이 GPU를 추가할 수 있는 게 최대의 장점입니다.
    경우에 따라 2 GPU + eGPU로 세 대 구성도 가능해보입니다.
  • M.2 슬롯을 이용해 범용성이 좋습니다.
  • CPU Lane을 이용할 수 있습니다.
    칩셋 Lane은 다른 기기들과 대역폭을 공유하기 때문에 아무래도 CPU Lane이 좋겠죠.

단점

  • 사용하면서 문제는 없었지만, 일주일 내내 돌려도 문제 없을지는 모르겠습니다.
    (OCuLink 커넥터 부가 녹은 사례가 있습니다.)
  • PC 주변 공간을 추가로 차지합니다.
  • 케이블이 생각보다 짧고, 핫 플러그를 지원하지 않습니다.
  • CPU 혹은 메인보드 둘 중 하나가 PCIe 3.0만 지원하면 PCIe 3.0으로 동작합니다.
    e.g. 5600G + x570, 인텔 11세대 + z490

기타

  • 별도 전원이 필요한 점은 장점이자 단점입니다.
    전력소모가 적은 GPU를 추가할 경우, PSU 전력에 여유가 있다면 라이저케이블이 나을 것 같습니다.



기타

CUDA-Z로 성능 확인 시, PCIe 4.0 x4에 적절한 대역폭으로 사용하는 것을 확인할 수 있었습니다. (이론속도 7.88GB/s)

PCIe 4.0 x16OCuLink (PCIe 4.0 x4)



총 비용

OCuLink eGPU : 52.68달러(약 72,000원)

700W PSU : 54,500원

GPU : 별도

----------------------------------------------

소계 : 126,500원 + GPU

----------------------------------------------

eGPU 케이스 : 44.50달러(약 60,000원)

----------------------------------------------

합계 : 186,500원 + GPU


케이스

이거 사지마세요ㅠㅠ

보기에는 깔끔해 보이지만 쿨링도 어렵고 퀄리티도 별로고 약해보여서 들고다니기도 애매합니다.

차라리 부피가 좀 크더라도 저렴한 ITX 케이스에 ATX파워 어댑터 사는 게 나아보입니다.


참고




사족)

알리 세일에 못참고 5700x를 지르고 3090x2 x8/x8 시스템을 준비중입니다. (중복 투자ㅠㅠㅠㅠㅠㅠ)