콘텐츠로 이동

엔진 생성 방법

벡터 (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개로 복원합니다.
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
8 - 10 16384
11 - 23 32768

행렬 (GL) 엔진

Engine(form)
제일 기본적인 행렬 엔진 생성 방식입니다. 아무것도 추가로 설정할 필요없이 최대 7회의 곱셈을 지원합니다. (256, 32, 32) 크기의 입력값이 동시에 암호화됩니다.
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, 64))
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 기반으로 수행됩니다.

현재 device 1개의 머신만을 상정해서 개발되었습니다. 추후에 여러 device를 지원할 예정입니다. 현재는 기본적으로 0번 device에서 동작합니다.

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, 64), mode="gpu")
medium_matrix_engine = Engine(shape=(256, 64, 64), mode="gpu")

기본적으로는 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")

tiny_engine = Engine(log_coeff_count=13, special_prime_count=1, mode="parallel")
small_engine = Engine(
    log_coeff_count=14, special_prime_count=1, mode="parallel"
)
medium_engine = Engine(
    log_coeff_count=15, special_prime_count=2, mode="parallel"
)
large_engine = Engine(
    log_coeff_count=16, special_prime_count=4, mode="parallel"
)
huge_engine = Engine(log_coeff_count=17, special_prime_count=6, 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, 64), 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)