ตัวอย่างของวิธีการ RWKV กับโมเดลภาษาที่เขียนด้วย Rust โดยคนที่รู้น้อยมากเกี่ยวกับคณิตศาสตร์หรือเครือข่ายประสาท เวอร์ชันเริ่มต้นนั้นขึ้นอยู่กับข้อมูลที่น่าทึ่งและตัวอย่าง Python ที่นี่: https://johanwind.github.io/2023/03/23/rwkv_details.html
ดูที่เก็บของผู้สร้าง RWKV: https://github.com/blinkdl/chatrwkv/
หากโหลดในโหมด 32 บิตมันใช้หน่วยความจำ จำนวน มาก รุ่น 3B ใช้ RAM ประมาณ 11GB และ 7B อันเดียวอาจ พอดี กับเครื่อง 32GB ที่คุณยินดีที่จะปิดแอปพลิเคชันอื่น ๆ หรือจัดการกับการแลกเปลี่ยนบางอย่าง แม้แต่การโหลดในโหมด 8 บิตก็ใช้หน่วยความจำในปริมาณที่พอเหมาะ แต่จะลดลงเมื่อโหลดเสร็จสมบูรณ์
คุณจะต้องมีการตั้งค่าสนิมและสินค้า: https://www.rust-lang.org/learn/get-started
คุณจะต้องดาวน์โหลดรุ่น RWKV นี่คือลิงค์ที่จะเริ่มต้น (ประมาณ 820MB): https://huggingface.co/blinkdl/rwkv-4-pile-430m/resolve/main/rwkv-4-pile-430m-20220808-8066.pth
นอกจากนี้ 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 เพื่อดูตัวเลือกคำสั่ง
หมายเหตุ : ค่าเริ่มต้นคือการใช้คอร์โลจิคัลทั้งหมดดูตัวเลือกคำสั่ง
คุณสามารถเลือกแปลงไฟล์โมเดล .pth เป็นรูปแบบ safetensors ดู utils/pth_to_safetensors.py สำหรับตัวอย่าง ในการทำเช่นนี้คุณจะต้องตั้งค่าแพ็คเกจ safetensors และ torch Python ฉันขอแนะนำให้ทำสิ่งนี้ในสภาพแวดล้อมเสมือนจริง ขณะนี้ไม่มีข้อได้เปรียบมากนักสำหรับขั้นตอนนี้เนื่องจากไฟล์คบเพลิงสามารถโหลดได้โดยตรงในเวอร์ชันปัจจุบัน
การสนับสนุน GGML ในปัจจุบันต้องการ ggml และ ggml-sys เวอร์ชันที่ได้รับการแก้ไขจากโครงการ llama-rs
Cargo.toml ถูกตั้งค่าเพื่อชี้ไปที่สาขาที่ถูกต้องในส้อมของฉัน แต่สิ่งนี้จะหายไปเมื่อการเปลี่ยนแปลงที่จำเป็นจะถูกรวมเข้ากับ GGML โดยธรรมชาติแล้ว repo นี้จะได้รับการอัปเดต แต่โปรดจำไว้ว่าการรวบรวมของคุณอาจเริ่มล้มเหลวในที่สุดหากคุณพยายามใช้เวอร์ชันเก่าเนื่องจากในที่สุดสาขานั้นจะถูกลบออก
หมายเหตุ: ตอนนี้เป็นส่วนที่ล้าสมัยแล้ว ฉันยังคงแนะนำให้อ่านลิงก์ด้านล่าง โปรดทราบว่าคำอธิบายนั้นขึ้นอยู่กับรุ่น RWKV ที่ง่ายกว่าที่มีเพียงสี่สถานะต่อเลเยอร์ เวอร์ชันเต็มมีห้า
นี่คือคำอธิบายระดับสูง (อาจผิด) ของขั้นตอนที่เกี่ยวข้องในการประเมินแบบจำลอง คุณจะต้องอ้างถึงแหล่งที่มาใน smolrwkv/src/simple/model.rs เพื่อให้เหมาะสม
นอกจากนี้ลองพิจารณาอ่านสิ่งเหล่านี้เป็นครั้งแรก:
โดยวิธีการที่สนุก: "เทนเซอร์" ฟังดูเป็นแฟนซีจริง แต่โดยทั่วไปแล้วมันเป็นเพียงอาร์เรย์ เทนเซอร์หนึ่งมิติเป็นเพียงอาร์เรย์หนึ่งมิติเทนเซอร์มิติสองมิติคืออาร์เรย์สองมิติ พวกเขาสามารถมีคุณสมบัติพิเศษ (เช่นไม่เปลี่ยนรูป) แต่นั่นไม่สำคัญสำหรับการทำความเข้าใจแนวคิดโดยทั่วไป หากคุณรู้จักอาร์เรย์คุณมีความคิดทั่วไปของเทนเซอร์อยู่แล้ว
เพื่อประเมินโทเค็น:
x จาก ln0x นี้ไปยังแต่ละเลเยอร์ตามลำดับโดยใช้ x The Layer ที่สร้างขึ้นสำหรับชั้นถัดไปx ที่ได้รับอาหารln1 กับ x และป้อนให้ผสมเวลา สิ่งนี้ใช้เทนเซอร์จากส่วน FFN ของโมเดลtm_state จากสถานะเลเยอร์และเรียกมันว่า last_x (ทำไมใครจะรู้!)tm_num และ tm_den เป็น last_num , last_dentm_[state,num,den] ดังนั้นอัปเดตสถานะเลเยอร์ของคุณด้วยสิ่งเหล่านี้x ซึ่งเป็นผลมาจากการคำนวณx จากการผสมเวลาเป็น x ( x += time_mixing_x )ln2 กับ x และป้อนเข้ากับช่องทางผสม สิ่งนี้ใช้เทนเซอร์จากส่วนเครือข่าย Feed Forward ของโมเดลcm_state จากสถานะเลเยอร์และเรียกมันว่า last_xcm_state ใหม่เพื่ออัปเดตสถานะเลเยอร์x ซึ่งเป็นผลมาจากการคำนวณการผสมช่องx จากช่องคลอดไปที่ xx ซึ่งเป็นผลลัพธ์หลังจากประเมินเลเยอร์สุดท้ายโมเดลมีรายการโทเค็นมัน "รู้" บางครั้งโทเค็นเท่ากับคำบางครั้งมันเป็นเพียงส่วนหนึ่งของคำ มักจะมีโทเค็นจำนวนมากในช่วง 30,000-60,000 ฉันเชื่อว่ารุ่น RWKV ปัจจุบันมีโทเค็น 50,277 อย่างไรก็ตามคุณจะได้รับรายการหมายเลขจุดลอยตัว 50,277 ครั้งหลังจากเรียกใช้โมเดล
ค่าสูงสุดจากรายการนั้นคือโทเค็นที่โมเดลคาดการณ์ว่าเป็นความต่อเนื่องที่น่าจะเป็นไปได้มากที่สุด หากคุณสร้างรายการที่จัดเรียงของความน่าจะเป็นโทเค็น 10-40 อันดับแรกและเลือกหนึ่งแบบสุ่มคุณจะได้รับผลลัพธ์ที่สมเหตุสมผลพอสมควร ยุติธรรมที่จะบอกว่าโมเดลขนาดเล็กขนาดเล็กไม่ได้ผลิตผลลัพธ์ที่สมเหตุสมผลที่สุดโดยทั่วไป
คำอธิบายที่ดีเกี่ยวกับวิธีจัดการขั้นตอนต่อไปเมื่อคุณมีรายการความน่าจะเป็น: https://huggingface.co/blog/how-to-generate
มีสิ่งคณิตศาสตร์ที่ซับซ้อนต่าง ๆ ที่เกี่ยวข้องในการประเมินแบบจำลอง แต่สิ่งเดียวที่สำคัญจริงๆคือการคูณเมทริกซ์ ( pardot ในแหล่งที่มา) ในกรณีของ RWKV การคูณเมทริกซ์-เวกเตอร์ (อาเรย์ 2D คูณด้วยอาร์เรย์ 1D) > 90% ของเวลาที่ใช้ในการประเมินแบบจำลองอยู่ในการคูณการคูณเมทริกซ์เหล่านั้น
ในโหมดที่ไม่ใช่ GGML การจัดการคณิตศาสตร์/อาร์เรย์ที่นี่ใช้ลัง ndarray มันมีฟังก์ชั่น .dot แต่สิ่งนี้จะ ไม่ คำนวณการคูณเมทริกซ์-เวกเตอร์แบบขนานแม้ว่าลังจะอ้างสิทธิ์ในการสนับสนุนเธรด เนื่องจากการคำนวณนี้มีความสำคัญอย่างยิ่งสำหรับประสิทธิภาพฉันจึงเขียนฟังก์ชั่นของตัวเองเพื่อแยกการคำนวณเป็นชิ้นและเรียกใช้ในแบบคู่ขนาน ดูฟังก์ชั่นในโมดูล dumdot ใน smolrwkv/src/util.rs
ความจริงที่ว่าคุณได้รับรายการความน่าจะเป็นกลับมาและไม่มี "คำตอบ" ที่ชัดเจนจากโมเดลดูเหมือนจะเป็นการโต้เถียงที่ดีต่อความคิดที่ว่า LLMS เป็นหรืออาจมีสติในบางวิธี เมื่อคุณดูผลลัพธ์จาก LLM หลายครั้งที่คุณไม่ได้เห็นโทเค็นที่น่าจะเป็นไปได้มากที่สุด นอกจากนี้ความจริงที่สนุกสนาน: เมื่อคุณป้อนพรอมต์ให้กับโมเดลมันจะมาพร้อมกับรายการความน่าจะเป็นเช่นเดียวกับเมื่อคุณขอคำตอบ อย่างไรก็ตามความน่าจะเป็นเหล่านั้นถูกทิ้งไปยกเว้นผลลัพธ์หลังจากประมวลผลโทเค็นแจ้งครั้งสุดท้าย
แจ้งเป็นตัวหนา งูหรือสุนัข Dragons Tree? โลกอาจไม่มีทางรู้!
* 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 ยังแสดงให้เห็นว่ามังกรเป็นจริงสัตว์เลื้อยคลานหรืองูต้นไม้อาคา
มังกรไม่ใช่งู
ตามทีมวิจัยมังกรที่พบในทิเบตเป็นเผ่าพันธุ์ของสุนัขไม่ใช่สัตว์เลื้อยคลาน
ในขณะที่ทีมวิจัยยังไม่สามารถหาคำอธิบายใด ๆ ได้ว่าทำไมมังกรเหล่านี้อาศัยอยู่ในทิเบต แต่ก่อนหน้านี้เชื่อว่าพวกเขามักจะอยู่บนบกใกล้กับที่ราบสูงทิเบต
“ มังกรอาศัยอยู่ที่นั่นเป็นส่วนหนึ่งของที่ราบสูงชิงไห่ทิเบตที่เกือบจะไม่ถูกรบกวนอย่างสมบูรณ์และที่ราบสูงชิงไห่ทิเบตค่อยๆเปลี่ยนเป็นรัฐเกษตรกรรมดังนั้นพวกเขาจึงมีรูปแบบที่โดดเด่นของการเคี้ยวบนต้นไม้