콘텐츠로 이동

엔진 생성 방법

Warning

Engine의 인자는 모두 키워드로만 전달할 수 있습니다. 예를 들어 Engine(17)이 아니라 Engine(max_level=17)로 작성합니다.

벡터 (CKKS)

Engine()
제일 기본적인 벡터 엔진 생성 방식입니다. 아무것도 추가로 설정할 필요없이 최대 7회의 곱셈을 지원합니다. 암호문은 8192개 단위로 암호화됩니다.
from desilofhe import Engine

engine = Engine()

최대 곱셈 횟수

Engine(max_level=...)
최대 곱셈 횟수에 따라서 엔진의 파라미터를 조정할 수 있습니다. 최대 곱셈 횟수가 늘어나면 한번에 암호화 되는 단위(slot_count)도 증가합니다. 최대 곱셈 횟수와 암호화 단위에 비례해서 메모리 사용량과 연산 시간이 증가하기 때문에, 필요한 곱셈 횟수만큼만 설정하는 것을 권장합니다.
from desilofhe import Engine

tiny_engine = Engine(max_level=2)
small_engine = Engine(max_level=7)
medium_engine = Engine(max_level=17)
large_engine = Engine(max_level=36)

레벨별 필요 암호화 단위

최대 곱셈 횟수 암호화 단위
0 - 2 4096
3 - 7 8192
8 - 17 16384
18 - 36 32768

부트스트랩

Engine(bootstrap=True)
부트스트랩 연산을 활성화합니다. 부트스트랩 연산은 암호문의 곱셈 레벨을 17개로 복원합니다. multiparty=True와 함께 사용할 수 없습니다.
from desilofhe import Engine

bootstrap_engine = Engine(bootstrap=True)

다자간 연산

Engine(multiparty=True)
다자간 연산을 활용하도록 엔진을 설정할 수도 있습니다. 기본 설정으로는 최대 10회의 곱셈을 지원합니다. 자세한 사용법에 대해서는 다자간 연산 페이지를 참고하세요.
from desilofhe import Engine

small_multiparty_engine = Engine(max_level=4, multiparty=True)
medium_multiparty_engine = Engine(max_level=10, multiparty=True)
large_multiparty_engine = Engine(max_level=23, multiparty=True)

레벨별 필요 암호화 단위

최대 곱셈 횟수 암호화 단위
0 - 4 8192
5 - 10 16384
11 - 23 32768

행렬 (GL) 엔진

Engine(form="matrix")
제일 기본적인 행렬 엔진 생성 방식입니다. 아무것도 추가로 설정할 필요없이 최대 7회의 곱셈을 지원합니다. (256, 32, 32) 크기의 입력값이 동시에 암호화됩니다. 행렬 형태에서는 bootstrap=True와 multiparty=True를 지원하지 않습니다.
from desilofhe import Engine

engine = Engine(form="matrix")

형상

Engine(shape=...)
행렬 엔진의 입력값의 형상(shape)을 지정할 수 있습니다. 형상에 따라서 최대 곱셈 레벨이 결정이 됩니다. 형상의 총 크기와 최대 곱셈 레벨에 비례해서 메모리 사용량과 연산 시간이 증가하기 때문에, 적절한 형상을 선택하는 것이 중요합니다.
from desilofhe import Engine

tiny_matrix_engine = Engine(shape=(256, 16, 16))
small_matrix_engine = Engine(shape=(256, 32, 32))
medium_matrix_engine = Engine(shape=(256, 64, 64))

지원 형상:

Shape Max Level
(256, 16, 16) 2
(256, 32, 32) 7
(256, 64, 64) 17
(162, 32, 32) 3
(162, 64, 64) 9
(162, 128, 128) 21
(486, 16, 16) 7
(486, 32, 32) 16
(486, 64, 64) 33

GPU

엔진 생성시 gpu 라는 모드로 설정할 경우, 모든 연산이 GPU 기반으로 수행됩니다.

엔진 하나는 GPU 1개에서 동작하며, 기본적으로 0번 device를 사용합니다. GPU가 여러 개인 머신에서는 device_id로 사용할 device를 지정할 수 있습니다. 예: Engine(mode="gpu", device_id=1)

from desilofhe import Engine

engine = Engine(mode="gpu")

tiny_engine = Engine(max_level=2, mode="gpu")
small_engine = Engine(max_level=7, mode="gpu")
medium_engine = Engine(max_level=17, mode="gpu")
large_engine = Engine(max_level=36, mode="gpu")

bootstrap_engine = Engine(bootstrap=True, mode="gpu")

small_multiparty_engine = Engine(max_level=4, multiparty=True, mode="gpu")
medium_multiparty_engine = Engine(max_level=10, multiparty=True, mode="gpu")
large_multiparty_engine = Engine(max_level=23, multiparty=True, mode="gpu")

matrix_engine = Engine(form="matrix", mode="gpu")

tiny_matrix_engine = Engine(shape=(256, 16, 16), mode="gpu")
small_matrix_engine = Engine(shape=(256, 32, 32), mode="gpu")
medium_matrix_engine = Engine(shape=(256, 64, 64), mode="gpu")

other_gpu_engine = Engine(mode="gpu", device_id=1)

기본적으로는 1024개의 CUDA 스레드를 사용합니다. 스레드 개수를 조절하고 싶으면 추가로 스레드 개수를 지정할 수 있습니다. 예를 들어 128개를 사용한다면 다음과 같이 지정할 수 있습니다.

  • Engine(mode="gpu", thread_count=128)
  • Engine(max_level=16, mode="gpu", thread_count=128)
  • Engine(bootstrap=True, mode="gpu", thread_count=128)

CPU Parallel

엔진 생성시 parallel 라는 모드로 설정할 경우, 모든 연산이 CPU에서 병렬로 수행됩니다.
from desilofhe import Engine

engine = Engine(mode="parallel")

tiny_engine = Engine(max_level=2, mode="parallel")
small_engine = Engine(max_level=7, mode="parallel")
medium_engine = Engine(max_level=17, mode="parallel")
large_engine = Engine(max_level=36, mode="parallel")

matrix_engine = Engine(form="matrix", mode="parallel")

tiny_matrix_engine = Engine(shape=(256, 16, 16), mode="parallel")
small_matrix_engine = Engine(shape=(256, 32, 32), mode="parallel")
medium_matrix_engine = Engine(shape=(256, 64, 64), mode="parallel")

기본적으로는 4개의 연산 스레드를 사용합니다. 스레드 개수를 조절하고 싶으면 추가로 스레드 개수를 지정할 수 있습니다. 예를 들어 16개를 사용한다면 다음과 같이 지정할 수 있습니다.

  • Engine(mode="parallel", thread_count=16)
  • Engine(max_level=16, mode="parallel", thread_count=16)
  • Engine(bootstrap=True, mode="parallel", thread_count=16)