Heim > Artikel > Technologie-Peripheriegeräte > Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache
Intel® Extension for Transformers[1] ist ein innovatives Toolkit von Intel, das auf Intel® Architekturplattformen, insbesondere den skalierbaren Intel® Xeon® Prozessoren der vierten Generation (Codename Sapphire Rapids[2) basieren kann ], SPR) beschleunigt das Transformer-basierte Large Language Model (LLM) erheblich. Zu seinen Hauptfunktionen gehören:
Dieser Artikel konzentriert sich auf die LLM-Inferenzlaufzeit (als „LLM-Laufzeit“ bezeichnet) und wie man die Transformer-basierte API verwendet, um effizienteres LLM auf Intel® Xeon® skalierbaren Prozessoren zu implementieren. Begründung und Vorgehensweise sich mit den Anwendungsproblemen von LLM in Chat-Szenarien auseinanderzusetzen.
Die von Intel® Extension for Transformers bereitgestellte LLM Runtime[8] ist eine leichte, aber effiziente LLM-Inferenzlaufzeit, die von GGML[9] inspiriert ist und mit llama.cpp[ kompatibel ist. 10] ist kompatibel und verfügt über die folgenden Funktionen:
Verwendung von Transformer-basiert API, implementiert auf der CPU LLM Efficient Inference
Mit weniger als 9 Codezeilen können Sie eine bessere LLM-Inferenzleistung auf der CPU erzielen. Benutzer können ganz einfach eine Transformer-ähnliche API zur Quantifizierung und Inferenz aktivieren. Setzen Sie einfach „load_in_4bit“ auf „true“ und importieren Sie das Modell von der HuggingFace-URL oder dem lokalen Pfad. Beispielcode zum Aktivieren der reinen INT4-Quantisierung mit Gewichtung finden Sie unten:
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)
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)
Leistungstest
Nach kontinuierlichen Bemühungen wurde die INT4-Leistung des oben genannten Optimierungsschemas erheblich verbessert. In diesem Artikel wird ein Leistungsvergleich mit llama.cpp auf einem System durchgeführt, das mit
Intel® GB (16 x 16 GB DDR5 4800 MT/s [4800 MT/s]), BIOS 3A14.TEL2P1, Mikrocode 0x2b0001b0, CentOS Stream 8 ausgestattet ist. Die Ergebnisse des Inferenzleistungstests sind in der folgenden Tabelle aufgeführt, wobei die Eingabegröße 32, die Ausgabegröße 32 und der Strahl 1 beträgt.
△Tabelle 1. Vergleich der Inferenzleistung zwischen LLM Runtime und llama.cpp (Eingabegröße = 32, Ausgabegröße = 32, Strahl = 1)
△Tabelle 2. LLM-Laufzeitvergleich mit der Inferenzleistung von llama.cpp (Eingabegröße = 1024, Ausgabegröße = 32, Strahl = 1)
Gemäß Tabelle 2 oben: Im Vergleich zu llama.cpp, das auch auf dem skalierbaren Intel® Token und der nächste Token werden jeweils um das bis zu 40-fache erhöht [a] (Baichuan-13B, Eingabe ist 1024) bzw. um das 2,68-fache [b] (MPT-7B, Eingabe ist 1024). Der Test von llama.cpp verwendet die Standardcodebasis [10]. Durch die Kombination der Testergebnisse in Tabelle 1 und Tabelle 2 kann der Schluss gezogen werden, dass LLM Runtime im Vergleich zu llama.cpp, das auch auf dem skalierbaren Intel® Bei einer Eingabegröße von 1024 wird eine Verbesserung um das 3,58- bis 21,5-fache erreicht. Bei einer Eingabegröße von 32 wird eine Verbesserung um das 1,76- bis 3,43-fache erreicht.
GenauigkeitstestIntel® Extension for Transformers kann Quantisierungsmethoden wie SignRound[11], RTN und GPTQ[12] in
Intel®△Tabelle 3. Genauigkeitsvergleich zwischen INT4 und FP32
Wie aus Tabelle 3 oben ersichtlich ist, ist der Genauigkeitsverlust der INT4-Inferenz, die von mehreren Modellen basierend auf LLM Runtime durchgeführt wird, sehr gering und kann fast ignoriert werden. Wir haben viele Modelle überprüft, aus Platzgründen sind hier jedoch nur einige aufgeführt. Wenn Sie weitere Informationen oder Details wünschen, besuchen Sie bitte diesen Link:Gleichzeitig verfügt LLM Runtime[8] auch über die Tensor-Parallelisierungsfunktion einer Dual-Channel-CPU, was eines der frühesten Produkte mit einer solchen Funktion ist. In Zukunft werden Dual Nodes weiter unterstützt. Der Vorteil von LLM Runtime liegt jedoch nicht nur in seiner besseren Leistung und Genauigkeit, wir haben auch große Anstrengungen unternommen, um seine Funktionalität in Chat-Anwendungsszenarien zu verbessern und die folgenden Anwendungen zu lösen, auf die LLM in Chat-Szenarien stoßen kann Dilemma:
Streaming LLM
Im Gegensatz zum herkömmlichen KV-Cache-Algorithmus kombiniert unsere Methode Aufmerksamkeitssenke (4 anfängliche Token), um die Stabilität der Aufmerksamkeitsberechnung zu verbessern, und behält die neuesten Informationen mithilfe des
rollenden KV-Cache-TokensDer Inhalt, der neu geschrieben werden muss, ist: △ Abbildung 2. KV-Cache von Steam LLM mit Aufmerksamkeitssenke zur Implementierung eines effizienten Streaming-Sprachmodells (Bildquelle: [13])
Darüber hinaus unterscheidet es sich von Lama. cpp: Dieser Optimierungsplan fügt auch neue Parameter wie „n_keep“ und „n_discard“ hinzu, um die Streaming-LLM-Strategie zu verbessern. Benutzer können den Parameter „n_keep“ verwenden, um die Anzahl der Token anzugeben, die im KV-Cache aufbewahrt werden sollen, und den Parameter „n_discard“, um die Anzahl der generierten Token zu bestimmen, die verworfen werden sollen. Um Leistung und Genauigkeit besser in Einklang zu bringen, verwirft das System standardmäßig die Hälfte der neuesten Token-Nummer im KV-Cache.“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性能。
Das obige ist der detaillierte Inhalt vonVerbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!