작성자: Henry Ndubuaku(Discord 및 Docs 배지를 클릭할 수 있음)
N/B: 코드는 반복을 대가로 교육학적으로 구현됩니다. 각 모델은 파일 간 종속성 없이 의도적으로 파일에 포함됩니다.
변환기 기반 모델을 개발하고 훈련하는 것은 일반적으로 리소스 집약적이고 시간 소모적이며 AI/ML 전문가는 특정 문제에 대해 이러한 모델의 소규모 버전을 구축해야 하는 경우가 많습니다. 리소스는 적지만 강력한 프레임워크인 Jax는 신경망 개발을 가속화하고 분산 훈련을 추상화하지만 Jax의 변환기 개발을 위한 기존 리소스는 제한되어 있습니다. NanoDL은 다음 기능을 통해 이 문제를 해결합니다.
다양한 블록과 레이어를 통해 처음부터 맞춤형 변압기 모델을 쉽게 생성할 수 있습니다.
Gemma, LlaMa3, Mistral, GPT3, GPT4(추론), T5, Whisper, ViT, Mixers, CLIP 등과 같은 광범위한 모델 선택
수동 훈련 루프가 필요 없이 여러 GPU 또는 TPU에서 데이터 병렬 분산 트레이너 모델을 만듭니다.
Dataloaders는 Jax/Flax의 데이터 처리 프로세스를 더욱 간단하고 효과적으로 만듭니다.
RoPE, GQA, MQA, SW 등 Flax/Jax에는 없는 레이어를 주목하여 보다 유연한 모델 개발이 가능합니다.
PCA, KMeans, 회귀, 가우스 프로세스 등과 같은 GPU/TPU 가속 클래식 ML 모델
자세한 코드가 필요하지 않은 Jax의 실제 난수 생성기입니다.
Gaussian Blur, BLEU, Tokenizer 등과 같은 NLP 및 컴퓨터 비전 작업을 위한 다양한 고급 알고리즘
각 모델은 외부 종속성 없이 단일 파일에 포함되어 있으므로 소스 코드도 쉽게 사용할 수 있습니다.
장황한 코드가 필요하지 않은 Jax의 실제 난수 생성기입니다(다음 섹션에 표시된 예).
저장소에는 아직 패키지를 통해 사용할 수 없는 실험적 및/또는 미완성 기능(예: MAMBA, KAN, BitNet, GAT 및 RLHF)이 있지만 이 저장소에서 복사할 수 있습니다. 토론, 문제 및 끌어오기 요청 스레드에 대한 피드백을 환영합니다! 기능 요청, 문제, 질문 또는 우려 사항이 있는 경우 Discord에 보고하거나 현재 진행 중인 작업을 알려주세요!
Python 3.9 이상이 필요하며 JAX 설치, FLAX 설치, OPTAX 설치 작업이 필요합니다(학습 실행을 위한 GPU 지원 포함, 생성만 지원 가능). 모델은 CPU에서 설계하고 테스트할 수 있지만 트레이너는 모두 분산 데이터 병렬이므로 1~N GPUS/TPUS가 있는 GPU가 필요합니다. CPU 전용 버전의 JAX의 경우:
pip install --upgrade pip # To support manylinux2010 wheels. pip install jax flax optax
그런 다음 PyPi에서 nanodl을 설치합니다.
pip install nanodl
nanodl API의 다양한 사용 예시를 제공합니다.
import jaximport nanodlimport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import GPT4, GPTDataParallelTrainer# 데이터 세트 준비batch_size = 8max_length = 50vocab_size = 1000# 무작위 데이터 생성 = nanodl.uniform(shape=(batch_size, max_length), minval=0, maxval=vocab_size-1).astype(jnp.int32)# 다음 토큰 예측 데이터세트를 생성하도록 이동dummy_inputs, dummy_targets = data[:, :-1], data[:, 1:]# 데이터세트 및 dataloaderdataset = ArrayDataset(dummy_inputs , dummy_targets)dataloader = DataLoader(데이터 세트, 배치_크기=배치_크기, shuffle=True, drop_last=False)# 모델 매개변수hyperparams = {'num_layers': 1,'hidden_dim': 256,'num_heads': 2,'feedforward_dim': 256,'dropout': 0.1,'vocab_size': vocab_size,'embed_dim': 256 ,'최대_길이': max_length,'start_token': 0,'end_token': 50, }# 추론된 GPT4 모델 model = GPT4(**hyperparams)trainer = GPTDataParallelTrainer(model, dummy_inputs.shape, 'params.pkl')trainer.train(train_loader=dataloader, num_epochs=100, val_loader=dataloader) # 실제 val 데이터 사용 # 시작 토큰에서 생성start_tokens = jnp.array([[123, 456]])# 훈련된 매개변수를 로드하는 것을 기억하세요 params = Trainer.load_params('params.pkl')outputs = model.apply( {'params': params}, start_tokens,rngs={'dropout': nanodl.time_rng_key()}, method=model.generate)
비전 예시
import nanodlimport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import DiffusionModel, DiffusionDataParallelTrainerimage_size = 32block_length = 2batch_size = 8widths = [32, 64, 128]input_shape = (101, image_size, image_size, 3)images = nanodl.normal(shape=input_shape)# 자신만의 이미지를 사용하세요dataset = ArrayDataset(images) dataloader = DataLoader(데이터 세트, 배치_크기=배치_크기, shuffle=True, drop_last=False) # 확산 모델 생성diffusion_model = DiffusionModel(image_size, widths, block_length)# 데이터 트레이너에 대한 교육 = DiffusionDataParallelTrainer(diffusion_model, input_shape=images.shape, Weights_filename='params.pkl', learning_rate=1e-4)trainer.train(dataloader, 10)# 일부 샘플 생성: 각 모델은 Flax.linen 모듈입니다# 평소대로 사용합니다. params = train.load_params('params.pkl')generated_images = 확산_모델.apply( {'매개변수': 매개변수}, num_images=5, 확산_단계=5, 방법=diffusion_model.generate)
오디오 예시
import jaximport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import Whisper, WhisperDataParallelTrainer# 더미 데이터 매개변수batch_size = 8max_length = 50embed_dim = 256 vocab_size = 1000 # 데이터 생성: 실제 토큰화/양자화 datadummy_targets =로 대체 jnp.ones((101, max_length), dtype=jnp.int32)dummy_inputs = jnp.ones((101, max_length, embed_dim))dataset = ArrayDataset(dummy_inputs, dummy_targets)dataloader = DataLoader(데이터 세트, 배치_크기=batch_size, shuffle= 참, drop_last=False)# 모델 매개변수hyperparams = {'num_layers': 1,'hidden_dim': 256,'num_heads': 2,'feedforward_dim': 256,'dropout': 0.1,'vocab_size': 1000,'embed_dim': embed_dim,'max_length': max_length ,'시작_토큰': 0,'end_token': 50, }# 모델 초기화model = Whisper(**hyperparams)# 데이터트레이너 훈련 = WhisperDataParallelTrainer(model, dummy_inputs.shape, dummy_targets.shape, 'params.pkl')trainer.train(dataloader, 2, dataloader)# 샘플 inferenceparams = Trainer.load_params('params.pkl')# 둘 이상의 샘플의 경우 종종 model.generate_batchtranscripts = model.apply({'params를 사용합니다. ': 매개변수}, dummy_inputs[:1], 메서드=model.generate)
RLHF에 대한 보상 모델의 예
import nanodlimport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import Mistral, RewardModel, RewardDataParallelTrainer# 더미 databatch_size 생성 = 8max_length = 10# 실제 토큰화된 데이터로 교체dummy_chosen = jnp.ones((101, max_length), dtype=jnp.int32) dummy_rejected = jnp.zeros((101, max_length), dtype=jnp.int32)# 데이터세트 및 dataloader 생성dataset = ArrayDataset(dummy_chosen, dummy_rejected)dataloader = DataLoader(dataset, bat_size=batch_size, shuffle=True, drop_last=False) # 모델 매개변수hyperparams = {'num_layers': 1,'hidden_dim': 256,'num_heads': 2,'feedforward_dim': 256,'dropout': 0.1,'vocab_size': 1000,'embed_dim': 256,'max_length': max_length,'start_token': 0,'end_token': 50, '그룹 수': 2,'창_크기': 5,'shift_size': 2}# Mistralmodel에서 보상 모델 초기화 = Mistral(**hyperparams)reward_model = RewardModel(model,dim=hyperparams['hidden_dim'], dropout=0.1)# 보상 모델 학습trainer = RewardDataParallelTrainer(reward_model, dummy_chosen.shape, 'reward_model_weights.pkl')trainer.train(dataloader, 5, dataloader)params = Trainer.load_params('reward_model_weights.pkl')# 일반 Flax 모델처럼 호출합니다rewards = award_model.apply({'params': params}, dummy_chosen, rngs={'dropout': nanodl.time_rng_key()})
PCA 예
import nanodlfrom nanodl import PCA# 실제 데이터 데이터 사용 = nanodl.normal(shape=(1000, 10))# PCA 초기화 및 학습 모델pca = PCA(n_comComponents=2)pca.fit(data)# PCA 가져오기 변환transformed_data = pca.transform( data)# 역변형 가져오기original_data = pca.inverse_transform(transformed_data)# 샘플 distributionX_sampled = pca.sample(n_samples=1000, 키=없음)
이것은 아직 개발 중이고 훌륭하게 작동하지만 거칠기가 예상되므로 기여를 적극 권장합니다!
디자인 패턴을 변경하지 않고도 변경 작업을 수행할 수 있습니다.
필요한 경우 변경 사항에 대한 테스트를 작성하세요.
pip3 install -e .
.
python3 -m unittest discover -s tests
사용하여 테스트를 실행하세요.
그런 다음 끌어오기 요청을 제출하세요.
기부는 다양한 형태로 이루어질 수 있습니다:
문서 작성.
버그 수정.
논문을 구현합니다.
높은 적용 범위의 테스트를 작성합니다.
기존 코드를 최적화합니다.
실제 사례를 실험하고 예제 섹션에 제출합니다.
버그를 보고합니다.
보고된 문제에 대한 대응
Discord Server에 가입하여 더 많은 정보를 알아보세요.
"NanoDL"이라는 이름은 Nano Deep Learning을 의미합니다. 모델의 규모가 폭발적으로 증가하고 있으므로 자원이 제한된 전문가와 기업은 엄청난 비용 없이 유연한 모델을 구축할 수 있습니다. Phi 모델의 성공에 따라 장기적인 목표는 사용 가능한 모든 모델의 나노 버전을 구축하고 교육하는 동시에 총 매개변수 수가 1B를 초과하지 않는 성능으로 원래 모델과 경쟁하도록 하는 것입니다. 훈련된 가중치는 이 라이브러리를 통해 제공됩니다. 어떤 형태의 후원이나 자금 지원도 훈련 자원에 도움이 될 것입니다. 여기 GitHub를 통해 후원하거나 [email protected]을 통해 연락하실 수 있습니다.
이 저장소를 인용하려면:
@software{nanodl2024github, author = {Henry Ndubuaku}, title = {NanoDL: A Jax-based library for designing and training transformer models from scratch.}, url = {http://github.com/hmunachi/nanodl}, year = {2024}, }