기본 콘텐츠로 건너뛰기

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...

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

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

OAuth 2.0과 OpenID Connect 요약

OAuth 2.0과 OpenID Connect 요약 1. 표준 The OAuth 2.0 Authorization Framework OpenID Connect Core 1.0 incorporating errata set 1 2. 용어 및 약어 인증(Authentication) - 사용자 신원 검증 인가(Authorization) - 접근 권한 부여 정보주체(Resource Owner) - 정보 소유자 인증서버(Authorization Server) - 사용자 인증 수행 신원확인서버(Identity Provider, 줄여서 IdP) - 사용자 인증 수행 및 사용자 정보 제공 서버 정보제공서버(Resource Server) - 정보 서비스를 제공하는 서버 3. 질문과 답 OAuth 2.0과 OpenID Connect(OIDC)를 한 줄로 설명한다면? OAuth 2.0 - 접근 권한 부여 프레임워크 (사용자 인증 부분을 정의하지 않고 자율에 맡김) OpenID Connect - 사용자 신원 인증 규격 (OAuth 2.0에서 자율에 맡겨 두었던 사용자 인증 부분을 정의함) 그렇다고 OAuth 2.0의 부분집합은 아님 OAuth 2.0의 확장이라고 말하는 것도 적합한 표현은 아님 OpenID Connect를 OAuth 2.0의 상위 계층으로 표현하는 것도 가능해 보임(HTTP를 TCP의 상위 계층으로 두는 것과 유사) 규격을 정의한 단체가 다름을 떠나서 개념만 놓고 보면 OpenID Connect는 OAuth 2.0의 한 부분을 정의하고 있다. OAuth 2.0의 Authorization Code Flow에서 OpenID Connect가 만드는 차이는? Authorization Endpoint 에 요청할 때 scope 항목의 값으로 openid 를 지정 Token Endpoint 의 응답으로 Access Token 과 ID Token 전달 Authorization Cod...

가설 검정 제대로 이해하기

가설 검정 제대로 이해하기 ( 주의 : 공부하면서 작성하는 문서라서 오류가 있을 수 있습니다.) 1. 문제 정의 1.1. 사례 기존 가설: 20 대 한국인 남성의 100 미터 달리기 평균 속도는 17 초 새로운 실험 결과: 무작위로 추출한 20 대 한국인 남성 500 명의 100 미터 달리기 평균 속도는 16 초 위 사례에서 새로운 실험 결과가 우연히 일어났다고 보는 것이 적절할까요 아니면 가설이 유효하지 않은걸까요? 정답이 존재하지 않는 이런 종류의 문제를 다루기 위해서는 차이가 얼마나 의미있는지 표현하는 객관적인 방법이 있어야 하지 않을까요? 1.2. 문제 기존 가설과 새로운 실험의 결과가 양립하는 정도 를 체계 적인 과정을 통해 숫자 로 표현하는 방법은 무엇인가? 2. 용어 정리 2.1. 출처: 위키백과 , WIKIPEDIA 통계적 추론 추론 통계 또는 추론 통계학(inferential statistics)으로 불린다. 기술 통계학(descriptive statistics)과 구별되는 개념 도수 확률(frequency probability)과 사전 확률(prior probability)을 기반으로 하는 베이즈 추론의 두 학파가 있다. 추정 (estimation)과 가설 검정 (hypothesis test)으로 나눌 수 있다. 가설 검정 통계적 가설 검정(statistical hypothesis test) 모집단 실제의 값이 얼마가 된다는 주장 과 관련해, 표본 의 정보를 사용 해서 가설의 합당성 여부를 판정 하는 과정 가설 검정 또는 가설검증(hypothesis test)이라고 부르는 경우도 많다. 통계적 가설 하나의 특정 주장을 모수 를 이용해 나타낸 형태 를 지칭 귀무가설 (Null hypothesis, H 0 H_0 H 0 ​ , 영가설)과 이와 반대에 있는 대립가설 (Alternative hypothesis, H 1 H_1 H 1 ​ )로 나타낸...