엔진 생성 방법
벡터 (CKKS)
Engine()- 제일 기본적인 벡터 엔진 생성 방식입니다. 아무것도 추가로 설정할 필요없이 최대 7회의 곱셈을 지원합니다. 암호문은 8192개 단위로 암호화됩니다.
최대 곱셈 횟수
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개로 복원합니다.
다자간 연산
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) 크기의 입력값이 동시에 암호화됩니다.
형상
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)