Heim  >  Artikel  >  Technologie-Peripheriegeräte  >  Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache

Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache

王林
王林nach vorne
2023-11-30 20:26:05757Durchsuche

Intel® Was ist eine Erweiterung für Transformer?

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:

  • Bieten Sie Benutzern ein nahtloses Modellkomprimierungserlebnis durch die Erweiterung der Hugging Face Transformers API[3] und die Nutzung von Intel® Neural Compressor[4]
  • Bereitstellen der Verwendung von Low-Bit-Quantisierungskernen ( NeurIPS 2023: Die LLM-Inferenzlaufzeit, die effiziente LLM-Inferenz [5] auf der CPU implementiert, unterstützt Falcon, LLaMA, MPT, Llama2, BLOOM, OPT, ChatGLM2, GPT-J-6B, Baichuan-13B-Base, Baichuan2-13B-Base , Gängige LLMs wie Qwen-7B, Qwen-14B und Dolly-v2-3B [6];
  • Advanced Compressed Sensing Runtime [7] (NeurIPS 2022: Fast Distillation on CPU und QuaLA-MiniLM: Automatische Anpassung der Quantisierungslänge an MiniLM ; NeurIPS 2021: Einmal beschneiden, vergessen: vorab trainierte Sprachmodelle spärlich/beschneiden).

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.

LLM Runtime (LLM Runtime)

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:

  • Der Kernel wurde für die verschiedenen in Intel® Xeon® CPUs (wie AMX, VNNI) und die AVX512F- und AVX2-Befehlssätze integrierten KI-Beschleunigungstechnologien optimiert Bietet mehr Quantifizierungsoptionen, wie zum Beispiel: unterschiedliche Granularitäten (nach Kanal oder nach Gruppe), unterschiedliche Gruppengrößen (wie zum Beispiel: 32/128);
  • Verfügt über bessere KV-Cache-Zugriffs- und Speicherzuweisungsfunktionen; Inferenz in Mehrkanalsystemen.
  • Das vereinfachte Architekturdiagramm von LLM Runtime lautet wie folgt:

Der Inhalt, der neu geschrieben werden muss, ist: △Abbildung 1. Vereinfachtes Architekturdiagramm von LLM Runtime der Intel® Extension für Transformers

Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-facheVerwendung 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)

Die Standardeinstellungen sind: Gewichtungen als 4 Bits speichern, Berechnungen als 8 Bits durchführen. Es unterstützt aber auch verschiedene Kombinationen von Berechnungsdatentypen (dtype) und Gewichtsdatentypen, und Benutzer können die Einstellungen nach Bedarf ändern. Nachfolgend finden Sie Beispielcode für die Verwendung dieser Funktion:

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)

Die Testergebnisse der Inferenzleistung, wenn die Eingabegröße 1024, die Ausgabegröße 32 und der Strahl 1 beträgt. Siehe die Tabelle unten Einzelheiten: Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache

△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®

Neural Compressor nutzen und die Datensätze lambada_openai, piqa, winogrande und hellaswag verwenden. Verifizierte INT4-Inferenz Genauigkeit. Die folgende Tabelle vergleicht die Durchschnittswerte der Testergebnisse mit der FP32-Genauigkeit.

△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:
https://medium.com/@NeuralCompressor/llm-performance-of-intel-extension-for-transformers-f7d061556176Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache.
Erweiterte Funktionen: Erfüllen Sie die Anwendungsanforderungen von LLM in mehr Szenarien

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:

Beim Dialog geht es nicht nur um LLM-Argumentation, auch der Dialogverlauf ist nützlich.

Begrenzte Ausgabelänge: Das Vortraining des LLM-Modells basiert hauptsächlich auf einer begrenzten Sequenzlänge. Daher nimmt die Genauigkeit ab, wenn die Sequenzlänge die während des Vortrainings verwendete Aufmerksamkeitsfenstergröße überschreitet.

Ineffizienz: Während der Dekodierungsphase speichert Transformer-basiertes LLM den Schlüsselwertstatus (KV) aller zuvor generierten Token, was zu einer übermäßigen Speichernutzung und einer erhöhten Dekodierungslatenz führt.
  1. Was das erste Problem betrifft, so wird die Dialogfunktion von LLM Runtime dadurch gelöst, dass mehr Dialogverlaufsdaten integriert und mehr Ausgaben generiert werden, wofür llama.cpp noch nicht gut gerüstet ist.
  2. Bezüglich der zweiten und dritten Frage haben wir Streaming-LLM (Steaming LLM) in die
  3. Intel®
  4. Extension für Transformers integriert, was die Speichernutzung deutlich optimieren und die Inferenzlatenz reduzieren kann.

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-Tokens

bei entscheidend für die Sprachmodellierung. Das Design ist äußerst flexibel und kann nahtlos in autoregressive Sprachmodelle integriert werden, die die Rotationspositionskodierung RoPE und die relative Positionskodierung ALiBi nutzen können.

Der 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.
Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-facheGleichzeitig haben wir zur weiteren Verbesserung der Leistung auch Streaming LLM zum MHA-Fusionsmodus hinzugefügt. Wenn das Modell die Rotationspositionskodierung (RoPE) verwendet, um die Positionseinbettung zu implementieren, müssen Sie nur eine „Verschiebungsoperation“ auf den vorhandenen K-Cache anwenden, um zu vermeiden, dass Operationen an zuvor generierten Token ausgeführt werden, die nicht verworfen wurden. Diese Methode nutzt nicht nur die volle Kontextgröße beim Generieren von Langtext voll aus, sondern verursacht auch keinen zusätzlichen Overhead, bis der KV-Cache-Kontext vollständig gefüllt ist.

“shift operation”依赖于旋转的交换性和关联性,或复数乘法。例如:如果某个token的K-张量初始放置位置为m并且旋转了θfor i ∈ [0,d/2),那么当它需要移动到m-1这个位置时,则可以旋转回到(-1)×θfor i ∈ [0,d/2)。这正是每次舍弃n_discard个token的缓存时发生的事情,而此时剩余的每个token都需要“移动”n_discard个位置。下图以“n_keep=4、n_ctx=16、n_discard=1”为例,展示了这一过程。

Verbessern Sie die Inferenzleistung großer Modelle mithilfe des Toolkits um das 40-fache

△图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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen