- 부캠 CV 트랙 두 분과 함께 갔다. 저녁을 같이 먹고 같이 갔다. 재미있었다.
- 나중에 또 뵐 수 있었으면 좋겠다.
- paint trasformer 를 써서 참신한 플젝을 하신 팀이었다.
- 한 분은 3학년이시고 한 분은 석사를 졸업했다 하셨다. 자연과학 쪽이셨나..
- 부캠라디오, 나는 안 들어갔었는데, 거기서 커플 이야기가 나왔고 이번 기수에서 몇 나올 것 같다고.. 음 뭐..
- 끝나고 뒤풀이라도 하자 말씀드렸는데 안 된다 하셨다. 아쉽다.
- 모두연에 들어가려 한다. 가능하다면. 퀀텀 랩도 있던데, qiskit 의 신소영님꼐서 운영하시는 곳이었다. 들어가고는 싶은데- quantum computing 까지 가능할지 모르겠다. 퀀트도 하고 싶은데..
JAX/Flax 톺아보기
- JAX: XLA와 autograd를 이용해 머신러닝 연구와 고성능 연작업을 위해 만든 프레임워크
- familiat API
- JAX provides a familiat numpy sytle api for ease of adoption by researchers and engineers
- transformations JAX
- includes composable function transformations for complition, bathcing, autumatic differentitation, and parrellzation
- Run anywhere
- the same code executes on mlutiple backends, including CPU, GPU, TPU
- 파이토치는 to_device 가 필요함. 근데 얘는 아님. 코랩에서 런타임 바꾸듯 바꿀 수 있음.
- the same code executes on mlutiple backends, including CPU, GPU, TPU
- 함수형 프로그래밍을 따름. immutable 함
- 인터프리터
- 라인 단위로 번역
- 실행 시간이 느림
- 코드 수정 후 바로 실행 가능
- 파이썬, 루비 등
- 컴파일러
- 전체 코드를 컴파일
- 실행속도가 빠름
- 코드 수정 후 컴파일을 해야 함
- c, c++ 등
- JIT
- 둘의 사이에 있음.
- 런타임 실행 시 코드의 일부분을 컴파일. JAX 에서는 @fit, jax.jit 으로 사용
- 일부만 컴파일
- C#, java 에서도 있음
- 그냥 컴파일하는 방식으로 파이써닉한 언어 만들면 되지 않나?
이렇게 하면 대화형이 안되는건가?
- XLA - CPU, GPA 과 같은 기기에 대해 JIT 컴파일 기법을 사용해 런타임에 사용자가 작성한 텐플 그래프를 분석… - 위키에 있다고 함
- jax.grad
- stop_gradient
- 파라미터 freeze
- vmap - 벡터화
- 배치마다 함수를 적용시키고 쌓는
- 빠르게 실행할 수 있음
- LAX
- JAX 보다 low level 에 있는 API (xla 의 애너그램)
- jax, numpy 보다 type 에 엄격함
- LAX API 의 경우 성능이 뛰어나지만 사용자 친화적이지는 않음
- JAX 보다 low level 의 api 가 있다는 것 정도로 이해
- 주의할점
- JAX는 함수형 프로그래밍을 따름
- 이런 immutability 는 함수형 프로그래밍이라면 항상 있음
- pure function
- 같은 입력값이 주어졌을 떄 언제나 같은 결과값을 리턴
- 부수효과를 만들지 않음 - side effect! 함수 내부에서 바깥의 인자를 변경하거나 프로그램의 흐름을 방해하는 것이 없어야 함
- 입력이 같으면 같은 출력이 나와야 함
- iterator 를 보냈을때와 array 를 넣었을때가 다름
- iterator가 돌면서 메모리를 차지하는데 이게 상태를 변화시킨다고 하여 functional programming에 맞지 않는다고 함
- make jaxpr 를 사용하면 내부 값 디버깅 가능
- JAX 배열은 불변
- jit 사용시 static 한 게 있따면 @partial 데코레이터를 사용. 텐플에서도 있음. 많이쓰임
- 벗어난 인덱스를 대하는 방법이 다름
- JAX는 함수형 프로그래밍을 따름
- random numvber
- np.random.random
- JAX 에서는 random.prngkry(seed) 로 키를 만들어서 사용함
- pure function 때문!
- 상태를 보존할 수 있음
- 호출할때마다 다른 값이 나오는 걸 막을 수 있음
- 넘파이는 병렬화시킬 때 너무 많은 것을 가정. 그리고 jax.prngkey 를 하면 random number 가 고정됨
- key 를 임시로 데이터 만들때에도 쓰고 train state 를 줄때도 사용함. 퓨어펑션 때문이고, 결국 함수형 프로그래밍 때문이다
- stateless class
- ml programming
- stateful
- parameters
- optimizer state
- batchnorm 등의 layer state
-> 학습을 하며 상태가 바뀜
- functional programming 에서는 stateless 해야함
- 밖에서 관리!
- explicit state!
- state 를 계속 밖에서 확인할 수 있게 return 값에 state 를 포함시키면 됨
- ml programming
- pytree
- 객체를 contatiner 처럼 만들어서 올리는 트리구조
- python 의 map 과 유사하게 작동
- 여러 인수를 사용할 경우 입력 구조가 정확히 일피해야 함. list 에는 동일한 수의 요소가 있어야 하고, dict 에는 동일한 키가 있어야 함
- weight, bias 를 이렇게 묶을 수 있을 것임. tensorflow 쓸때는 list 인지 dict 인지 확인을 안하고 쓰지만 JAX 에서는 이렇게 씀. FLAX 쓴다면 이렇게까지 보진 않아도 됨..
- 트리맵으로 계산할땐 무조건 사이즈가 맞아야 한다
- parellel evaluation in jax
- jax에서 기기를 병렬적으로 쓰는 방법 - jax.pmap
- vmap 하고싶은데 병렬적으로 하고싶다 -> 그냥 pmap쓰면됨. 얘는 jax.jit 이나 데코레이터르 안 감싸도 됨. 내부적으로 해줌
- nn.compact - init를 안 씀
- train state
- optax - 옵티마이저
- 텐플에서 jit.compile 사용가능.. jax 안써도
- JAX/FLAX lab
- 모두연 이영빈?
- 튜토리얼 번역, JAX/Flax 로 변환하는 플젝 진행
- 월요일 7시반!
- 잭스 도큐먼트 번역
- 번역 그라운드 룰 정하기, 번역 문서 나누기
- convolution, 합성곱..? - 어떤 용어를 써야 하는지, 이런 것들
- 번역하고 용어 정리하기 - 크로스 검토하기
- 아 JAX 도 해야 하는데-
first draft: 2023.02.11 21:42