[Qdrant] GPU ๊ฐ€์†

Qdrant๋Š” GPU๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๊ฐ€์†ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋ฒกํ„ฐ-๋ฒกํ„ฐ๊ฐ„ ๋น„๊ต๊ฐ€ ํ•ต์‹ฌ ์—ฐ์‚ฐ์ด๋‹ค๋ณด๋‹ˆ, GPU๋ฅผ ํ™œ์šฉํ•œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์—์„œ ์ด์ ์„ ๋งŽ์ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.




์ œํ•œ์‚ฌํ•ญ

1.13๋ฒ„์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ˜„ ์‹œ์ ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œํ•œ์‚ฌํ•ญ์ด ์žˆ๋‹ค.

์ด์™ธ์—๋„ ์„ธ๊ทธ๋จผํŠธ ํฌ๊ธฐ ์ œํ•œ ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.
์ฐธ์กฐ https://qdrant.tech/documentation/guides/running-with-gpu/#known-limitations




์‚ฌ์–‘๊ณผ ์„ฑ๋Šฅ

๊ตณ์ด ๊ณ ์„ฑ๋Šฅ GPU๋ฅผ ์“ธ ํ•„์š”๋Š” ์—†๋‹ค.
์—ฌ๊ธฐ์„œ ์“ฐ๋Š” ๋ณ‘๋ ฌ์—ฐ์‚ฐ์ด๋ผ๊ณ  ํ•ด๋ด์•ผ ๊ทธ๋ ‡๊ฒŒ ํ—ค๋น„ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ์„œ, ์ ๋‹นํžˆ ์—”ํŠธ๋ฆฌ๊ธ‰์˜ GPU๋ฅผ ์จ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฒกํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์ˆ˜๋ก ์„ฑ๋Šฅ ํ–ฅ์ƒ ํšจ๊ณผ๋ฅผ ๋” ์ž˜ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค. ๋ฒกํ„ฐ/๋ฒกํ„ฐ ๋น„๊ต๋ฅผ ๋ณ‘๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ณต๊ฐœํ•œ ๋ฒค์น˜๋งˆํฌ์— ๋”ฐ๋ฅด๋ฉด 2-3๋ฐฐ ์ด์ƒ๋„ ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
๊ทผ๋ฐ ์ด๊ฑด ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ ๋งŽ์ด ๋‹ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋ƒฅ CPU๋งŒ ์“ฐ๋Š” ๊ฒƒ๊ณผ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋ณ„๋กœ ์—†์„ ์ˆ˜ ์žˆ๋‹ค.




GPU๋ฅผ ํ™œ์„ฑํ™”ํ•ด๋ณด๊ธฐ

๋‹น์—ฐํžˆ GPU์™€ ๊ทธ ๋“œ๋ผ์ด๋ฒ„ ์„ธํŒ…์€ ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
๋‚ด ๊ฒฝ์šฐ์—๋Š” ์—”๋น„๋””์•„ 2080์ด๋‹ค.

์ผ๋‹จ ์ด ๊ธฐ๋Šฅ์€ ๊ธฐ์กด ์„œ๋ฒ„๋กœ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์—†๋‹ค.
์†Œ์Šค์—์„œ ๋นŒ๋“œํ•œ๋‹ค๋ฉด ๋ณ„๋„ ์˜ต์…˜์„ ์ค˜์•ผ ํ•˜๊ณ , docker๋„ gpu ๋ฒ„์ „ ์ด๋ฏธ์ง€๊ฐ€ ๋”ฐ๋กœ ์žˆ๋‹ค.

์ด gpu ๋ฒ„์ „์„ ๋ฐ›์•„์„œ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ƒฅ docker๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๊ณ 

docker run \
	--rm \
	--gpus=all \
	-p 16333:6333 \
	-p 16334:6334 \
	-e QDRANT__GPU__INDEXING=1 \
	qdrant/qdrant:v1.15-gpu-nvidia

docker compose ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  qdrant-gpu:
    image: qdrant/qdrant:v1.15-gpu-nvidia
    container_name: qdrant-gpu
    ports:
      - "16333:6333"
      - "16334:6334"
    volumes:
      - qdrant_gpu:/qdrant/storage
    environment:
      - QDRANT__GPU__INDEXING=1
    ulimits:
      nofile: 65535
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
        limits:
          cpus: "4"
          memory: 16192M

๋‹น์—ฐํžˆ ์‚ฌ์šฉํ•  GPU์— ๋Œ€ํ•œ ๋“œ๋ผ์ด๋ฒ„ ์„ค์ •, ๋“œ๋ผ์ด๋ฒ„-์ปจํ…Œ์ด๋„ˆ ์„ค์น˜๋Š” ์‚ฌ์ „์— ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์‹คํ–‰ํ•ด์„œ

์œ„์™€ ๊ฐ™์ด GPU ๊ด€๋ จ ์‹คํ–‰ ๋กœ๊ทธ๊ฐ€ ๋œจ๋ฉด ์ ์šฉ์€ ์ž˜ ๋œ ๊ฒƒ์ด๋‹ค.


์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก์—๋„ ์ถ”๊ฐ€๋๋‹ค.




์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

๋Œ€์ถฉ 256๊ณผ 512 ๋ฒกํ„ฐ๋ฅผ 1000๋งŒ๊ฐœ์”ฉ ๋„ฃ๊ณ  ๋•Œ๋ฆฌ๋ฉด์„œ ๋น„๊ตํ•ด๋ดค๋‹ค.
๋ฒค์น˜๋งˆํฌ์— ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ๊นƒํ—™์— ์žˆ๋‹ค.
https://github.com/myyrakle/benchmarks/tree/master/qdrant_benchmark

์ด๊ฑด GPU ์‚ฌ์šฉ ์ „ INSERT ์†๋„

GPU ์‚ฌ์šฉ ์ „ READ ์ฒ˜๋ฆฌ๋Ÿ‰ - ๋™์‹œ ์ฟผ๋ฆฌ 20๊ฐœ

256์€ ์ดˆ๋‹น 235๊ฐœ ์ •๋„์˜ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ ˆ์ดํ„ด์‹œ๋Š” 100ms ์ •๋„ ๋๋‹ค.
512๋Š” ์ดˆ๋‹น 92๊ฐœ ์ •๋„๋ฐ–์— ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ๋ ˆ์ดํ„ด์‹œ๋Š” 200ms. ์‹คํŒจ๋„ ์ข€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋ฒกํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ ์•ˆ์ •์„ฑ์ด ๋งŽ์ด ๋–จ์–ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

GPU ์‚ฌ์šฉ ์ „ READ ์ฒ˜๋ฆฌ๋Ÿ‰ - ๋™์‹œ ์ฟผ๋ฆฌ 100๊ฐœ

๋™์‹œ ์ฟผ๋ฆฌ๋ฅผ ๋Š˜๋ฆฐ๋‹ค๊ณ  ๋ˆˆ์— ๋„๊ฒŒ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋Š˜์ง„ ์•Š์•˜๋‹ค. 512์˜ ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจ์œจ์ด ์ƒ๊ฒผ๋‹ค.

๊ทธ๋Ÿผ GPU ๋ชจ๋“œ๋กœ ์ฐŒ๋ฅด๋ฉด ์–ด๋–จ๊นŒ? ๊ฒฝ์ฒœ๋™์ง€ํ•  ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ์„๊นŒ?
๋™์‹œ ์ฟผ๋ฆฌ 20๊ฐœ ์ •๋„๋งŒ ๋ฐ€์–ด๋„ฃ์–ด๋ดค๋‹ค.

์ผ๋‹จ 256์˜ ๊ฒฝ์šฐ์—๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ๊ธด ํ•œ๋ฐ ๋ฏธ๋ฏธํ•˜๋‹ค.
TPS๊ฐ€ 235 => 284๋‹ˆ๊นŒ ๋Œ€์ถฉ 20% ์ •๋„๋Š” ํ–ฅ์ƒ์ด ๋œ ๊ฒƒ์ด๋‹ค.


๊ทผ๋ฐ 512๋Š” ์ข€ ์ด์ƒํ–ˆ๋‹ค.
์ฒ˜๋ฆฌ๋„ ์—„์ฒญ ๋А๋ฆฌ๊ณ , ๋™์‹œ ์ฒ˜๋ฆฌ๋Ÿ‰๋„ ๋ธ”๋ฝ์ด ๊ฑธ๋ฆฐ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค ๋ง‰ํžˆ๊ณ  ๋ป—์—ˆ๋‹ค.

๋ญ”๊ฐ€ ๋ฒ„๊ทธ๊ฐ€ ์ข€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.
๋˜‘๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ 256๊ณผ 512๋ฅผ ์ „๋ถ€ ์ดˆ๊ธฐํ™”ํ–ˆ๋Š”๋ฐ๋„ ํ•œ์ชฝ์—๋งŒ ์ด๋Ÿฐ ์ฆ์ƒ์ด ๋‚˜์™”๋‹ค.

์•„์ง ์•ˆ์ •ํ™”๋˜์—ˆ๋‹ค๊ณ  ๋ณด๊ธฐ๋Š” ์ด๋ฅธ๋“ฏ...



์ฐธ์กฐ
https://qdrant.tech/documentation/guides/running-with-gpu/
https://qdrant.tech/blog/qdrant-1.13.x/
https://whatap.io/ko/blog/qdrant-vector-db-batch-search-optimization