기본 콘텐츠로 건너뛰기

2024의 게시물 표시

Llama 3.2로 문장 생성 및 챗팅 완성 실습

Llama 3.2로 문장 생성 및 챗팅 완성 실습 Running Meta Llama on Linux 문서의 내용을 참고하여 Llama 3.2 1B 모델로 다음 두 가지 기능을 실습합니다. 문장 완성 챗팅 완성 실습 환경 Ubuntu 20.04.6 LTS Python 3.12.7 Llama3.2-1B, Llama3.2-1B-Instruct rustc 1.83.0 NVIDIA RTX 4090 24GB 프로그램 준비 실습에서 사용할 wget , md5sum 설치 sudo apt-get install wget sudo apt-get install md5sum NVIDIA GPU 설치 여부 확인 nvidia-smi 실습 디렉토리 만들기 mkdir llama3-demo cd llama3-demo git clone https://github.com/meta-llama/llama3.git Python 3.10 이상의 버전으로 가상환경 만들고 활성화 python -m venv llama-venv . llama-venv/bin/activate Rust 컴파일러 설치 How To Install Rust on Ubuntu 20.04 문서를 참고하여 Rust 컴파일러를 설치합니다. curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh 위 명령을 실행하면 아래와 같이 세 가지 선택 옵션이 나타나는데 그냥 엔터를 쳐서 1번 옵션으로 진행합니다. ... 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation 아래 명령을 실행하여 현재 쉘에 반영하고 설치된 컴파일러 버전을 확인합니다. source $HOME/.cargo/env rustc --version 의존 라이브러리 설치 pip install ...

JWT 토큰 생성과 유효성 확인 과정

JWT 토큰 생성과 유효성 확인 과정 API 서비스를 개발하고 이에 대한 접근 권한을 제어하기 위하여 JSON Web Token(JWT)을 활용할 수 있습니다. 이 문서에서는 JWT 토큰의 생성과 유효성 확인 과정을 그림과 Python 코드를 사용하여 설명합니다. 전자서명 알고리즘으로는 HS256을 사용 하였습니다. HS256(HMAC-SHA256) 대칭키 암호화 방식 HMAC(Hash-based Message Authentication Code) 해시 함수를 기반으로 메시지 인증 코드를 생성하는 알고리즘 다음은 토큰 생성과 유효성 확인 과정에서 사용하게 될 Base64 인코딩/디코딩 함수입니다. import base64 import hashlib import hmac def base64_encode ( input_as_bytes ) : b = base64 . urlsafe_b64encode ( input_as_bytes ) . decode ( 'utf-8' ) return b . rstrip ( '=' ) def base64_decode ( input_as_string ) : padding = 4 - len ( input_as_string ) % 4 input_as_string = input_as_string + '=' * padding return base64 . urlsafe_b64decode ( input_as_string . encode ( 'utf-8' ) ) . decode ( 'utf-8' ) 1. 토큰 생성 1.1. 다이어그램 1.2. Python 구현 def create_jwt_token ( header_obj_str , payload_obj_str , secret ) : header = base64_encod...

Circom SHA256 해시 예제

Circom SHA256 해시 예제 아래 문서의 예제를 약간 변형해서 SHA256 해시 검증을 실습하였습니다. Zero-Knowledge Proof of SHA256 Hash using zkSNARK , Binod, Medium 회로 생성 프로젝트 디렉토리에서 회로 파일 program.circom 작성 pragma circom 2.0.0; include "./circomlib/circuits/sha256/sha256.circom"; template program() { signal input in[8]; signal output out[256]; component SHA = Sha256(8); SHA.in <== in; out <== SHA.out; } component main = program(); 프로젝트 디렉토리에서 Git 저장소 circomlib 복제 git clone https://github.com/iden3/circomlib.git 회로 컴파일 circom program.circom --r1cs --wasm --sym --c 신뢰 설정 - Powers of Tau 프로젝트 디렉토리에서 ‘powers of tau’ ceremony 시작 snarkjs powersoftau new bn128 15 pot15_0000.ptau -v 첫 번째 기여 snarkjs powersoftau contribute pot15_0000.ptau pot15_0001.ptau --name="First contribution" -v 신뢰 설정 - Phase 2 program_js 디렉토리에서 Phase 2 준비 (시간이 많이 걸림) snarkjs powersoftau prepare phase2 ..\pot15_0001.ptau pot15_final.ptau -v .r1cs 파...

Circom 예제로 영지식 증명 시작하기 (1)

Circom 예제로 영지식 증명 시작하기 (1) Circom 2 Getting started 문서를 따라하면서 작성한 문서입니다. 실습 환경: Windows 11 Node.js v20.18.0 circom compiler 2.1.9 snarkjs@0.7.5 1. 소프트웨어 설치 Downloads 페이지에서 circom Windows binary 를 클릭하고 파일 circom-windows-amd64.exe 를 원하는 디렉토리에 저장합니다. 파일 크기는 약 10MB입니다. 여기서는 파일 이름을 circom.exe 로 바꾸고 아래 경로에 저장합니다. C:\DevTools\circom.exe snarkjs 를 설치합니다. npm install -g snarkjs 2. 회로 생성하기 아래 내용을 multiplier2.circom 에 저장합니다. pragma circom 2.0.0; /*This circuit template checks that c is the multiplication of a and b.*/ template Multiplier2 () { // Declaration of signals. signal input a; signal input b; signal output c; // Constraints. c <== a * b; } component main = Multiplier2(); 3. 회로 컴파일하기 multiplier2.circom 파일을 컴파일합니다. circom multiplier2.circom --r1cs --wasm --sym --c 컴파일 결과 다음과 같은 파일들이 생성됩니다. multiplier2.r1cs multiplier2.sym multiplier2_cpp\ calcwit.cpp calcwit.hpp circom.hpp fr.asm fr.cpp ...

snarkjs 예제로 영지식 증명 시작하기 (2)

snarkjs 예제로 영지식 증명 시작하기 (2) snarkjs 예제로 영지식 증명 시작하기 (1) 에서 작성한 회로의 제한 조건 개수를 1000에서 1로 변경하여 다음 두 가지 예시를 보여 줍니다. 증명 성공 예시 a*a + b의 결과가 20인 두 수를 제공할 수 있음 증명 실패 예시 a*a + b의 결과가 21인 두 수를 제공할 수 있음 1. 회로 생성 제한 조건 개수 변경하여 circuit2.circom 파일로 저장 pragma circom 2.0.0; template Multiplier(n) { signal input a; signal input b; signal output c; signal int[n]; int[0] <== a*a + b; for (var i=1; i<n; i++) { int[i] <== int[i-1]*int[i-1] + b; } c <== int[n-1]; } component main = Multiplier(1); 컴파일 circom --r1cs --wasm --c --sym --inspect circuit2.circom 2. 신뢰 설정 - Phase 2 snarkjs 예제로 영지식 증명 시작하기 (1) 의 중간 결과물을 활용하면서 새로 생성하는 파일들이 기존 파일들을 덮어쓰는 것을 피하기 위하여 circuit2_js 디렉토리로 이동하여 다음 작업들을 수행합니다. Phase 2 준비 snarkjs powersoftau prepare phase2 ..\pot14_beacon.ptau pot14_final.ptau -v 마지막 ptau 검증 snarkjs powersoftau verify pot14_final.ptau .r1cs 파일과 연관된 .zkey 파일 생성 snarkjs groth16 setup ..\circuit2.r...

Circom 예제로 영지식 증명 시작하기 (2)

Circom 예제로 영지식 증명 시작하기 (2) Circom 예제로 영지식 증명 시작하기 (1) 에서 작성한 회로를 사용하여 다음 두 가지 예시를 보여 줍니다. 증명 성공 예시 곱셈의 결과가 34인 두 수를 제공할 수 있음 증명 실패 예시 곱셈의 결과가 33인 두 수를 제공할 수 있음 곱셈의 결과가 34인 두 수를 제공할 수 있음 1. witness 계산하기 입력 값, 중간 신호, 출력 값을 witness 라고 합니다. multiplier2_js 디렉토리로 이동합니다. cd multiplier2_js 아래 내용을 input2.json 파일에 저장합니다. {"a": "2", "b": "17"} witness를 계산하여 witness2.wtns 파일에 저장합니다. node generate_witness.js multiplier2.wasm input2.json witness2.wtns 2. 증명 성공 예시 2.1. 증명 생성 회로 및 witness와 연관된 증명을 생성합니다. snarkjs groth16 prove multiplier2_0001.zkey witness2.wtns proof2.json public2.json 위 명령은 다음 두 파일을 생성합니다. proof2.json : 증명 포함 { "pi_a": [ "14743280952072949668948706550574899717145559551048017963794441189237494636481", "14298005267871599183835964858782397954547197261581693679006469198474879205631", "1" ], "pi_b": [ [ "362627714403151142...

snarkjs 예제로 영지식 증명 시작하기 (1)

snarkjs 예제로 영지식 증명 시작하기 (1) snarkjs README.md 문서를 따라하면서 작성한 문서입니다. 실습 환경: Windows 11 Node.js v20.18.0 circom compiler 2.1.9 snarkjs@0.7.5 1. 소프트웨어 설치 Downloads 페이지에서 circom Windows binary 를 클릭하고 파일 circom-windows-amd64.exe 를 원하는 디렉토리에 저장합니다. 파일 크기는 약 10MB입니다. 여기서는 파일 이름을 circom.exe 로 바꾸고 아래 경로에 저장합니다. C:\DevTools\circom.exe snarkjs 를 설치합니다. npm install -g snarkjs 2. 신뢰 설정 - Powers of Tau “powers of tau” ceremony 시작 snarkjs powersoftau new bn128 14 pot14_0000.ptau -v 첫 번째 기여 snarkjs powersoftau contribute pot14_0000.ptau pot14_0001.ptau --name="First contribution" -v 두 번째 기여 snarkjs powersoftau contribute pot14_0001.ptau pot14_0002.ptau --name="Second contribution" -v -e="some random text" 세 번째 기여 snarkjs powersoftau export challenge pot14_0002.ptau challenge_0003 snarkjs powersoftau challenge contribute bn128 challenge_0003 response_0003 -e="some random text" snarkjs powersoftau import respon...

Python 객체 저장 - pickle, pickletools

Python 객체 저장 - pickle, pickletools pickle, pickletools 모듈 문서 pickle - Python object serialization Protocol version 0 is the original “human-readable” protocol and is backwards compatible with earlier versions of Python. Protocol version 1 is an old binary format which is also compatible with earlier versions of Python. Protocol version 2 was introduced in Python 2.3. It provides much more efficient pickling of new-style classes . Refer to PEP 307 for information about improvements brought by protocol 2. Protocol version 3 was added in Python 3.0. It has explicit support for bytes objects and cannot be unpickled by Python 2.x. This was the default protocol in Python 3.0–3.7. Protocol version 4 was added in Python 3.4. It adds support for very large objects, pickling more kinds of objects, and some data format optimizations. It is the default protocol starting with Python 3.8. Refer to PEP 3154 for information about improvements brought by protocol 4. Prot...

TensorFlow 버전과 Keras 2 또는 3 버전

TensorFlow 버전과 Keras 2 또는 3 버전 개요 실습 목적 Python 버전에 따라 설치할 수 있는 TensorFlow 버전이 어떻게 달라지는지 파악합니다. TensorFlow를 설치하면 Keras도 설치됩니다. 어느 버전의 TensorFlow부터 Keras 3가 설치되는지 파악합니다. Keras 2.15.0에서 발생하는 TextVectorization 객체 직렬화 문제가 Keras 3에서는 발생하지 않는지 파악합니다. 실습 환경 Windows 10 환경에서 실습하고 문서를 작성하였습니다. 가상 환경 도구로는 Python 기본 라이브러리에 포함되어 있는 venv 를 사용하였습니다. SW 버전 Python 3.9.3 3.12.4 pip 22.0.4 24.0 TensorFlow 2.15.1 2.16.2 Keras 2.15.0 3.4.1 Python 3.9.13 + TensorFlow Python 설치 파일 다운로드 위치 Python Releases for Windows Python 3.9.13 - May 17, 2022 Download Windows installer (64-bit) 설치된 Python과 pip 버전 확인 >python --version Python 3.9.13 >pip --version pip 22.0.4 from C:\Users\user1\AppData\Local\Programs\Python\Python39\lib\site-packages\pip (python 3.9) 설치 가능한 TensorFlow 버전 출력 >pip index versions tensorflow WARNING: pip index is currently an experimental command. It may be removed/changed in a future release without pri...

카이제곱 검정 제대로 이해하기

카이제곱 검정 제대로 이해하기 1. 개념 이해 비교란 무엇인가? 비교의 대상은 두 개이고 두 비교 대상의 차이를 살펴 보는 것이다. 여기서는 관찰값 과 기댓값 의 차이를 사용한다. 관찰값: 관찰을 통해 얻는 값 기댓값: 관찰값에 대한 기댓값으로서 어떤 가정을 바탕 으로 함. 두 비교 대상에 대하여 비교할 수 있는 지점은 한 개일 수도 있고 여러 개일 수도 있다. 비교의 목적은 무엇인가? 관찰값 과 관찰값 을 비교 대상으로 삼을 수는 없는가? 비교할 수 있다. 그런데 어떻게 비교할 것인가? 기댓값을 찾고 관찰값들이 기댓값을 중심으로 어떤 분포를 따르는지 이해하는 것이 필요하다. 왜 그런가? 분포를 가정하지 않으면 흔히 일어나는 차이인지 아니면 드물게 일어나는 차이인지 객관적으로 표현하기가 어렵다. 기댓값 을 찾으려면 왜 그런 기대를 하게 되었는지와 관련하여 어떤 가정을 세워야 한다. 그 가정 위에서 기댓값을 구하고 차이를 계산했더니 흔히 일어나는 차이에 해당하면 그 가정은 유효하다고 간주하고 드물게 일어나는 차이에 해당하면 그 가정은 유효하지 않다고 간주한다. 결국 관찰값과 기댓값의 차이를 통해 가정이 유효한지 아닌지 판단하는 것이므로 비교의 목적은 어떤 가정을 채택할 것인지 버릴 것인지를 판단하기 위함 이라고 말할 수 있다. 2. 차이의 정도와 의미 차이의 정도를 수치로 나타낼 수 있는가? 비교 대상 간의 총체 적인 차이 는 무엇으로 정의할 것인가? 개별 데이터 지점에서의 차이 값의 제곱의 합 이라고 정의하자. 절대값의 합이 아니라 제곱의 합으로 정의한 이유는 수학적으로 다루기가 훨씬 쉽기 때문일 것이다. 아래의 수식은 피어슨 카이제곱 통계량 이고 이것으로 총체 적인 차이 를 계산한다. O i O_i O i ​ 는 i i i 번째 데이터 지점에서의 관찰값, E i E_i E i ​ 는 i i i 번째 데이터 지점에서의 기댓값을 나타낸다. χ 2 =...