Rumah > Artikel > Peranti teknologi > Tingkatkan prestasi inferens model besar sebanyak 40x menggunakan toolkit
Intel® Extension for Transformers[1] ialah kit alat inovatif yang dilancarkan oleh Intel yang boleh berdasarkan Intel® platform seni bina, terutamanya generasi keempat Intel® Xeon® pemproses Sapphi yang boleh diskalakan semula. ], SPR) mempercepatkan dengan ketara Model Bahasa Besar (LLM) berasaskan Transformer. Ciri-ciri utamanya termasuk:
, dan cara menggunakan API berasaskan Transformer untuk melaksanakan LLM yang lebih cekap pada Intel® Xeon® pemproses boleh skala Penaakulan dan cara untuk menangani masalah aplikasi LLM dalam senario sembang. LLM Runtime (LLM Runtime)
LLM Runtime[8] yang disediakan oleh Intel®Extension for Transformers ialah masa jalan inferens LLM yang ringan tetapi cekap, yang diilhamkan oleh GGML[9] dan serasi dengan llama.cpp[ 10] adalah serasi dan mempunyai ciri-ciri berikut:
Inti telah dioptimumkan untuk pelbagai teknologi pecutan AI terbina dalamDengan kurang daripada 9 baris kod, anda boleh mencapai prestasi inferens LLM yang lebih baik pada CPU. Pengguna boleh mendayakan API seperti Transformer dengan mudah untuk pengiraan dan inferens. Hanya tetapkan 'load_in_4bit' kepada benar dan import model daripada URL HuggingFace atau laluan setempat. Contoh kod untuk mendayakan kuantiti INT4 berat sahaja disediakan di bawah:
from transformers import AutoTokenizer, TextStreamerfrom intel_extension_for_transformers.transformers import AutoModelForCausalLMmodel_name = "Intel/neural-chat-7b-v3-1” prompt = "Once upon a time, there existed a little girl,"tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)inputs = tokenizer(prompt, return_tensors="pt").input_idsstreamer = TextStreamer(tokenizer)model = AutoModelForCausalLM.from_pretrained(model_name, load_in_4bit=True)outputs = model.generate(inputs, streamer=streamer, max_new_tokens=300)
Tetapan lalai ialah: simpan pemberat sebagai 4 bit, lakukan pengiraan sebagai 8 bit. Tetapi ia juga menyokong gabungan jenis data pengiraan (dtype) dan jenis data berat yang berbeza, dan pengguna boleh mengubah suai tetapan mengikut keperluan. Contoh kod untuk cara menggunakan ciri ini disediakan di bawah:
from transformers import AutoTokenizer, TextStreamerfrom intel_extension_for_transformers.transformers import AutoModelForCausalLM, WeightOnlyQuantConfigmodel_name = "Intel/neural-chat-7b-v3-1” prompt = "Once upon a time, there existed a little girl,"woq_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4")tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)inputs = tokenizer(prompt, return_tensors="pt").input_idsstreamer = TextStreamer(tokenizer)model = AutoModelForCausalLM.from_pretrained(model_name,quantization_cnotallow=woq_config)outputs = model.generate(inputs, streamer=streamer, max_new_tokens=300)Ujian PrestasiSelepas usaha berterusan, prestasi INT4 bagi skim pengoptimuman di atas telah dipertingkatkan dengan ketara. Artikel ini melakukan perbandingan prestasi dengan llama.cpp pada sistem yang dilengkapi dengan
Keputusan ujian prestasi inferens ditunjukkan dalam jadual di bawah, di mana saiz input ialah 32, saiz output ialah 32, dan rasuk ialah 1
△Jadual 1. Perbandingan prestasi inferens antara LLM Runtime dan llama.cpp (saiz input=32, Saiz output = 32, rasuk = 1)
Hasil ujian prestasi inferens apabila saiz input ialah 1024, saiz output ialah 32, dan rasuk ialah 1, lihat jadual berikut untuk butiran:△Jadual 2. Perbandingan Masa Jalan LLM dengan prestasi inferens llama.cpp (saiz input=1024, saiz output=32, rasuk=1)
Mengikut Jadual 2 di atas: Berbanding dengan llama.cpp yang juga berjalan pada pemproses Intel® Xeon® Scalable generasi keempat, sama ada token pertama atau token seterusnya, LLM Runtime boleh mengurangkan kelewatan dengan ketara dan kelajuan inferens yang pertama. token dan token seterusnya dinaikkan masing-masing sehingga 40 kali [a] (Baichuan-13B, input ialah 1024) dan 2.68 kali [b] (MPT-7B, input ialah 1024 ). Ujian llama.cpp menggunakan asas kod lalai [10]. Berdasarkan keputusan ujian dalam Jadual 1 dan Jadual 2, dapat disimpulkan bahawa berbanding dengan llama.cpp juga berjalan pada generasi keempat
Intel® Xeon®Pemproses boleh skala, LLM Runtime boleh meningkatkan dengan ketara banyak prestasi biasa keseluruhan LLM: apabila saiz input ialah 1024, peningkatan sebanyak 3.58 hingga 21.5 kali dicapai; apabila saiz input ialah 32, peningkatan sebanyak 1.76 hingga 3.43 kali dicapai[c]. Ujian Ketepatan
Intel®Pelanjutan untuk Transformers boleh memanfaatkan kaedah pengkuantitian seperti SignRound[11], RTN dan GPTQ[12] dalam Intel® Neural Compressor dan menggunakan lambadaferllaswagigrande, set data piqaference dan INT yang disahkan. ketepatan. Jadual di bawah membandingkan purata keputusan ujian dengan ketepatan FP32.
. Fungsi yang lebih maju: Memenuhi keperluan aplikasi LLM dalam lebih banyak senario
Walau bagaimanapun, kelebihan LLM Runtime bukan sahaja prestasi dan ketepatannya yang lebih baik, kami juga telah melaburkan banyak usaha untuk meningkatkan fungsinya dalam senario aplikasi sembang dan menyelesaikan aplikasi berikut yang mungkin dihadapi oleh LLM dalam senario sembang Dilema:
Dialog bukan sahaja tentang penaakulan LLM, sejarah dialog juga berguna.
Mengenai soalan kedua dan ketiga, kami menyepadukan penstriman LLM (Steaming LLM) ke dalam
Intel®Extension for Transformers, yang boleh mengoptimumkan penggunaan memori dengan ketara dan mengurangkan kependaman inferens. Streaming LLM
untuk meningkatkan kestabilan pengiraan perhatian dan mengekalkan yang terkini dengan bantuan rolling token cache KV, iaitu penting untuk pemodelan bahasa. Reka bentuk ini sangat fleksibel dan boleh disepadukan dengan lancar ke dalam model bahasa autoregresif yang mampu menggunakan pengekodan kedudukan putaran RoPE dan pengekodan kedudukan relatif ALiBi.
Selain itu, ia berbeza daripada llama. cpp , pelan pengoptimuman ini turut menambah parameter baharu seperti "n_keep" dan "n_discard" untuk meningkatkan strategi LLM Penstriman. Pengguna boleh menggunakan parameter "n_keep" untuk menentukan bilangan token untuk disimpan dalam cache KV, dan parameter "n_discard" untuk menentukan nombor untuk dibuang antara token yang dijana. Untuk mengimbangi prestasi dan ketepatan yang lebih baik, sistem membuang separuh daripada nombor token terkini dalam cache KV secara lalai
Pada masa yang sama, untuk meningkatkan lagi prestasi, kami juga telah menambahkan LLM Penstriman kepada mod gabungan MHA. Jika model menggunakan pengekodan kedudukan putaran (RoPE) untuk melaksanakan pembenaman kedudukan, maka anda hanya perlu menggunakan "operasi anjakan" pada K-Cache sedia ada untuk mengelak daripada menjalankan operasi pada token yang dijana sebelum ini yang belum dibuang. Kaedah ini bukan sahaja memanfaatkan sepenuhnya saiz konteks penuh apabila menjana teks panjang, tetapi juga tidak menanggung overhed tambahan sehingga konteks cache KV diisi sepenuhnya.
“shift operation”依赖于旋转的交换性和关联性,或复数乘法。例如:如果某个token的K-张量初始放置位置为m并且旋转了m×θi for i ∈ [0,d/2),那么当它需要移动到m-1这个位置时,则可以旋转回到(-1)×θi for i ∈ [0,d/2)。这正是每次舍弃n_discard个token的缓存时发生的事情,而此时剩余的每个token都需要“移动”n_discard个位置。下图以“n_keep=4、n_ctx=16、n_discard=1”为例,展示了这一过程。
△图3.Ring-Buffer KV-Cache和Shift-RoPE工作原理
需要注意的是:融合注意力层无需了解上述过程。如果对K-cache和V-cache进行相同的洗牌,注意力层会输出几乎相同的结果(可能存在因浮点误差导致的微小差异)。
您可以使用下面的代码来启动Streaming LLM:
from transformers import AutoTokenizer, TextStreamer from intel_extension_for_transformers.transformers import AutoModelForCausalLM, WeightOnlyQuantConfig model_name = "Intel/neural-chat-7b-v1-1" # Hugging Face model_id or local model woq_config = WeightOnlyQuantConfig(compute_dtype="int8", weight_dtype="int4") prompt = "Once upon a time, a little girl"tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) inputs = tokenizer(prompt, return_tensors="pt").input_ids streamer = TextStreamer(tokenizer)model = AutoModelForCausalLM.from_pretrained(model_name, quantization_cnotallow=woq_config, trust_remote_code=True) # Recommend n_keep=4 to do attention sinks (four initial tokens) and n_discard=-1 to drop half rencetly tokens when meet length threshold outputs = model.generate(inputs, streamer=streamer, max_new_tokens=300, ctx_size=100, n_keep=4, n_discard=-1)
本文基于上述实践经验,提供了一个在英特尔® 至强® 可扩展处理器上实现高效的低位(INT4)LLM推理的解决方案,并且在一系列常见LLM上验证了其通用性以及展现了其相对于其他基于CPU的开源解决方案的性能优势。未来,我们还将进一步提升CPU张量库和跨节点并行性能。
欢迎您试用英特尔® Extension for Transformers[1],并在英特尔® 平台上更高效地运行LLM推理!也欢迎您向代码仓库(repository)提交修改请求 (pull request)、问题或疑问。期待您的反馈!
在此致谢为此篇文章做出贡献的英特尔公司人工智能资深经理张瀚文及工程师许震中、余振滔、刘振卫、丁艺、王哲、刘宇澄。
[a]根据表2 Baichuan-13B的首个token测试结果计算而得。
[b]根据表2 MPT-7B的下一个token测试结果计算而得。
[c]当输入大小为1024时,整体性能=首个token性能+1023下一个token性能;当输入大小为32时,整体性能=首个token性能+31下一个token性能。
Atas ialah kandungan terperinci Tingkatkan prestasi inferens model besar sebanyak 40x menggunakan toolkit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!