변경 기록¶
0.4.0¶
0.3.0 이후 처음 내는 버전입니다. PyTorch 코드를 그대로 돌릴 수 있는 범위가 크게 넓어졌고, 0.3.0 코드 일부는 바꿔야 합니다(아래 "바뀐 API").
새 기능¶
- PyTorch식 모델 코드:
newch.net이 패키지가 되어newch.net.functional(F)과newch.net.init이 생겼습니다.ModuleList,ModuleDict,Identity, 손실 모듈,nll_loss,cat,stack, 비교 연산, dtype 변환이 추가되었습니다. - 트랜스포머: 배치 행렬곱,
LayerNorm,masked_fill,F.scaled_dot_product_attention,MultiheadAttention,TransformerEncoderLayer,TransformerEncoder. - 순환 신경망:
RNN,LSTM,GRU(다층, 양방향,batch_first)와RNNCell,LSTMCell,GRUCell. - 합성곱:
groups(depthwise 전용 커널),dilation,padding="same"/"valid", 배치 없는[C, H, W]입력. - 인덱싱: 모든 축의 정수·슬라이스·
None·...(복사 없는 뷰)와 정수 인덱스 리스트, 음수 인덱스. - 텐서: 모든 축
softmax, 여러 축sum/mean/amax, 정수→실수 승격(a / 2),uint8dtype,x / 0,int(t),x.device, 생성 함수의device=·requires_grad=, numpy와 섞은 연산이 Tensor를 유지. - 손실:
cross_entropy의 확률 타깃,[N, C, d1, ...]입력, 배치 없는 입력. - 학습 재개: 옵티마이저·스케줄러
state_dict()(PyTorch 구조)와 중첩 체크포인트를 한 파일에 저장하는save_tensors. - 성능: 역전파 중 메모리 해제(학습 스텝 메모리 약 절반), 추론 중 즉시 해제, 원소별 연산·합성곱 변환·풀링 멀티스레드, Python 호출 오버헤드 감소. 결과는 여전히 스레드 수와 무관하게 비트 단위로 같습니다.
- 사용법 안내 사이트(이 사이트). 예제 코드는 CI에서 실제로 실행해 검사합니다.
바뀐 API¶
| 0.3.0 | 0.4.0 |
|---|---|
nc.relu, nc.conv2d, nc.cross_entropy 등 신경망 함수 |
import newch.net.functional as F 후 F.relu 등 |
model.save_weights(p) / load_weights(p) |
nc.save_tensors(model.state_dict(), p) / model.load_state_dict(nc.load_tensors(p)) |
compile("adam")이 Keras 기본값 |
nc.optim.Adam을 그 기본값으로 만듦 |
nc.optim._KerasRMSprop, Optimizer.learning_rate |
nc.optim.RMSprop, Optimizer.lr |
콜백 LearningRateScheduler, ReduceLROnPlateau |
nc.optim.lr_scheduler.* |
compile(loss="mean_squared_error") |
loss="mse" |
newch.ml (scikit-learn식) |
삭제 |
nc.rand(..., low, high), nc.randn(..., std) |
nc.rand(...) * (high - low) + low, nc.randn(...) * std |
tensor.zero_grad() |
model.zero_grad() / optimizer.zero_grad() |
1차원 FileArray의 fa[i]가 [값] |
값 (numpy와 같음) |
고친 버그¶
- 보안: 데이터 크기가 모양과 맞지 않는 체크포인트를 열면 프로세스가 죽거나(Python) 힙 버퍼를 넘어 쓸 수 있던(C
nc_load) 문제. 0.3.0을 쓰고 있다면 신뢰할 수 없는.ncw파일을 열지 마세요. - 원소 수가 int64를 넘는 모양이 작은 버퍼로 할당되던 문제.
TensorDataset/FileArray의 범위 밖 인덱스가 첫 행으로 돌아가for x in ds가 끝나지 않던 문제.ndarray + tensor가 numpy 배열을 돌려주어 autograd가 끊기던 문제.tensor([np.float32(1.5)])가 int32가 되던 문제, bool 리스트를 인덱스로 읽던 문제.- 빈 축의 평균이 NaN이 아니라 0이던 문제.
Adam(betas=(0, ...)),RMSprop(alpha=0)의 0이 기본값으로 바뀌던 문제.EarlyStopping(restore_best_weights=True)가 BatchNorm 통계를 되돌리지 않던 문제.- 버린
Context가 엔진 메모리와 워커 스레드를 해제하지 않던 문제. - 벡터
exp가-inf에서 0이 아니던 문제(attention 마스크), 88.4 근처에서inf가 되던 문제. - 그 밖에 옵티마이저 인수 검사,
cat입력이 많을 때의 속도, 잘못된 dtype의 에러 메시지 등.
0.3.0¶
PyPI에 처음 올린 버전입니다.