수학이나 신경 네트워크에 대해 거의 모르는 사람이 Rust로 작성한 언어 모델에 대한 RWKV 접근법의 예. 초기 버전은 놀라운 정보와 Python 예제를 기반으로 매우 무겁습니다. https://johanwind.github.io/2023/03/23/rwkv_details.html
RWKV Creator 's Repository : https://github.com/blinkdl/chatrwkv/를 참조하십시오.
32 비트 모드로로드하는 경우 많은 메모리를 사용합니다. 3B 모델은 약 11GB RAM을 사용하고 7B는 다른 응용 프로그램을 닫거나 일부 교환을 처리 할 기꺼이 32GB 시스템에 적합 할 수 있습니다. 8 비트 모드에서로드하더라도 상당한 양의 메모리를 사용하지만로드가 완료되면 줄어 듭니다.
녹과화물 설정이 필요합니다 : https://www.rust-lang.org/learn/get-started
RWKV 모델을 다운로드해야합니다. 다음은 Get You Start (약 820MB)에 대한 링크입니다.
또한 Tokenizer는 https://github.com/blinkdl/chatrwkv/blob/main/20b_tokenizer.json입니다
Pytorch 모델 파일을 직접로드 할 수 있습니다. 파일이 .pt 또는 .pth 로 끝나면 Pytorch 모델로로드됩니다. .st 또는 .safetensors 로 끝나면 SAFETENSORS로로드됩니다. 참고 : Pytorch 지원은 현재 실험적이며 올바르게 작동하지 않을 수 있습니다. 문제가 있으면 즉시 오류가 발생하여 해당 접근법을 시도하는 것이 위험하지 않아야합니다. 원한다면 torch 기능을 비활성화하고 SAFETENSORS 형식 파일에 대한 지원 만 빌드 할 수 있습니다.
그 후, 당신은 단지 cargo run --release 만들 수 있어야합니다. --release 없이 컴파일을 시도 할 수 있지만 모든 것이 미친 듯이 느리게 될 것입니다. 또한 cargo run --release -- --help 사용하여 CommandLine 옵션을 확인하십시오.
참고 : 기본값은 모든 논리적 코어를 사용하는 것입니다. CommandLine 옵션을 참조하십시오.
.pth 모델 파일을 SAFETENSORS 형식으로 선택적으로 변환 할 수 있습니다. utils/pth_to_safetensors.py 를 예로 들어보십시오. 이를 위해서는 safetensors 및 torch PYTHON 패키지가 설정되어야합니다. 가상 환경 에서이 작업을 수행하는 것이 좋습니다. 현재 Torch 파일을 현재 버전에서 직접로드 할 수 있으므로 현재이 단계에는 많은 장점이 없습니다.
GGML 지원에는 현재 llama-rs 프로젝트의 패치 버전의 ggml 및 ggml-sys 필요합니다.
Cargo.toml 은 포크의 올바른 분기를 가리키기 위해 설정되지만 필요한 변경 사항이 GGML로 병합되면 사라집니다. 당연히이 repo는 업데이트되지만 이전 버전을 사용하려고하면 결국 컴파일이 실패 할 수 있습니다. 결국 해당 브랜치가 제거되므로.
참고 : 이 부분은 이제 구식입니다. 그래도 아래 링크를 읽는 것이 좋습니다. 또한이 설명은 레이어 당 4 개의 상태 만있는 더 간단한 RWKV 모델을 기반으로합니다. 정식 버전에는 5 개가 있습니다.
다음은 모델 평가와 관련된 단계에 대한 (아마도 잘못된) 높은 수준의 설명입니다. 이해하려면 smolrwkv/src/simple/model.rs 의 소스를 참조해야합니다.
또한 먼저 다음을 읽는 것을 강력히 고려하십시오.
그건 그렇고, 재미있는 사실 : "텐서"는 진짜 공상으로 들리지만 기본적으로 배열 일뿐입니다. 1 차원 텐서는 단지 1 차원 배열이고 2 차원 치수 텐서는 2 차원 배열입니다. 그들은 (불변성과 같은) 특수 속성을 가질 수 있지만 일반적으로 개념을 이해하는 데 중요하지 않습니다. 배열을 알고 있다면 이미 텐서에 대한 일반적인 아이디어가 있습니다.
토큰을 평가하려면 :
ln0 에서 x 의 초기 값을 계산하십시오.x 을 사용 하여이 x 각 층에 순차적으로 공급하십시오.x 가져 가면 X를 가져 가십시오.ln1 x 로 바르고 시간 믹싱에 공급하십시오. 이것은 모델의 FFN 부분의 텐서를 사용합니다.tm_state 가져 와서 last_x 부릅니다. (왜? 누가 알아!)tm_num 과 tm_den last_num , last_den 으로 가져 가십시오.tm_[state,num,den] 에 대한 새로운 값은 이들로 레이어 상태를 업데이트하십시오.x 반환합니다.x x ( x += time_mixing_x )로 추가하십시오.ln2 x 로 바르고 채널 믹싱에 공급하십시오. 이것은 모델의 피드 포워드 네트워크 부분의 텐서를 사용합니다.cm_state 가져 와서 last_x 부릅니다.cm_state 계산되므로 레이어 상태를 업데이트합니다.x 반환합니다.x x 에 추가하십시오.x 에 수학을 즐기십시오.이 모델에는 "알고있는"토큰 목록이 있습니다. 때로는 토큰이 단어와 같으며 때로는 단어의 일부일뿐입니다. 일반적으로 30,000-60,000 범위의 토큰이 많이 있습니다. 현재 RWKV 모델에는 50,277 개의 토큰이 있다고 생각합니다. 어쨌든, 모델을 실행 한 후 50,277 개의 부동 소수점 번호 목록을 얻을 수 있습니다.
이 목록에서 가장 높은 값은 모델이 예측할 수있는 토큰입니다. 상위 10-40 명 정도의 토큰 확률의 정렬 된 목록을 생성하고 무작위로 하나를 선택하면 비교적 말하면 상당히 합리적인 출력을 얻을 수 있습니다. 작은 430m 모델이 일반적으로 가장 합리적인 출력을 생성하지 않는다고 말하는 것은 공정합니다.
확률 목록이 있으면 다음 단계를 처리하는 방법에 대한 좋은 설명 : https://huggingface.co/blog/how-to-generate
모델을 평가하는 데 관련된 다양한 복잡한 수학 자료가 있지만 실제로 중요한 것은 매트릭스 곱셈 (소스의 pardot )입니다. RWKV의 경우 매트릭스 벡터 곱셈 (2D 어레이에 1D 배열이 곱하기)입니다. 모델을 평가하는 데 소요 된 시간의 90%는 해당 매트릭스 곱셈 호출에 있습니다.
비 GGML 모드에서 여기에서 수학/배열 처리는 ndarray 상자를 사용합니다. 그것은 .dot 함수를 제공하지만, 상자가 스레딩 지원을 주장하더라도 실제로 매트릭스 벡터 곱셈을 병렬로 계산 하지는 않습니다 . 이 계산은 성능에 매우 중요하기 때문에 계산을 청크로 나누고 병렬로 실행하기 위해 내 기능을 작성하게되었습니다. smolrwkv/src/util.rs 의 dumdot 모듈의 기능을 참조하십시오.
당신이 확률 목록을 되찾고 모델에서 명확한 "답변"이 없다는 사실은 LLM이 어떤 식 으로든 의식적이거나 의식 할 수 있다는 아이디어에 대한 상당한 반론처럼 보입니다. LLM의 출력을 볼 때 많은 시간이 가장 가능성이 높지 않을 것입니다. 또한 재미있는 사실 : 모델에 프롬프트를 공급할 때 응답을 요청할 때와 같은 확률 목록이 나타납니다. 그러나 이러한 확률은 마지막 프롬프트 토큰을 처리 한 후 결과를 제외하고는 버려집니다.
대담한 프롬프트. 드래곤의 나무 뱀이나 개입니까? 세상은 결코 알지 못할 수도 있습니다!
* Loading tokenizer from: ./20B_tokenizer.json
* Loading model from: ./RWKV-4-Pile-430M-20220808-8066.safetensors
* Discovering model structure.
- Loading layer 1/24
[...]
- Loading layer 24/24
* Loading non-layer tensors.
* Loaded: layers=24, embed=1024, vocab=50277
충격적인 발견에서 과학자는 티베트에서 이전에 탐구되지 않은 계곡에 사는 드래곤 무리를 발견했습니다. 연구원들에게 더욱 놀라운 것은 드래곤들이 완벽한 중국어를 말한다는 사실이었습니다.
이 용들은 모두 다른 방언을 사용 했으며이 방언은 개 모국어와 일치하지 않았습니다.
이 용들이 말한 것을 해독하려는 시도에서 그들은 용을 불렀고 그들의 언어가 인간과 다르다는 것을 알았습니다.
"용은 인간의 말과보다 정확하게 인간 언어를 이해했습니다. 용은 인간의 언어를 사용했습니다. 그들은 또한 중국어의 규칙을 이해했습니다."라고 Mongabay는 말했습니다.
그들은 연구를 수행함으로써 세계의 외딴 외딴 지역, 특히 티베트에서 드래곤의 신비한 역사를 밝히기를 희망하고 있습니다.
Open Science 저널에 발표 된 연구 프로젝트는 드래곤이 실제로 파충류 또는 일명 나무 뱀임을 보여줍니다.
뱀이 아닌 용
연구팀에 따르면, 티베트에서 발견 된 용은 파충류가 아닌 개 종족입니다.
연구팀은 여전히이 드래곤들이 티벳에 사는 이유에 대한 설명을 제시 할 수 없었지만, 이전에는 그들이 티베트 고원 근처의 땅에있을 가능성이 가장 높다고 믿었습니다.
"드래곤즈는 거의 완전히 방해받지 않은 위대한 칭하이 티베트 고원의 일부로 그곳에 살고 있으며 전체 칭하이 티베트 고원은 점차 농업 상태로 변환되었습니다. 따라서 나무를 씹는 독특한 패턴이있을 수 있습니다.