From 21fc781fce12d5b97d981b199ca7a096725e1690 Mon Sep 17 00:00:00 2001 From: ivy-lv11 <59141989+ivy-lv11@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:54:31 +0800 Subject: [PATCH] Add GLM-4V example (#11343) * add example * modify * modify * add line * add * add link and replace with phi-3-vision template * fix generate options * fix * fix --------- Co-authored-by: jinbridge <2635480475@qq.com> --- README.md | 1 + docs/readthedocs/source/index.rst | 7 + .../Model/glm-4v/README.md | 84 +++++++++++ .../Model/glm-4v/generate.py | 78 +++++++++++ .../Model/glm-4v/README.md | 132 ++++++++++++++++++ .../Model/glm-4v/generate.py | 81 +++++++++++ 6 files changed, 383 insertions(+) create mode 100644 python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm-4v/README.md create mode 100644 python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py create mode 100644 python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/README.md create mode 100644 python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py diff --git a/README.md b/README.md index e4eba63d..1b8fe3aa 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,7 @@ Over 50 models have been optimized/verified on `ipex-llm`, including *LLaMA/LLaM | ChatGLM2 | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/chatglm2) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/chatglm2) | | ChatGLM3 | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/chatglm3) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/chatglm3) | | GLM-4 | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm4) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm4) | +| GLM-4V | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm-4v) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v) | | Mistral | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/mistral) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/mistral) | | Mixtral | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/mixtral) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/mixtral) | | Falcon | [link](python/llm/example/CPU/HF-Transformers-AutoModels/Model/falcon) | [link](python/llm/example/GPU/HF-Transformers-AutoModels/Model/falcon) | diff --git a/docs/readthedocs/source/index.rst b/docs/readthedocs/source/index.rst index bc40a593..b7125664 100644 --- a/docs/readthedocs/source/index.rst +++ b/docs/readthedocs/source/index.rst @@ -313,6 +313,13 @@ Verified Models
diff --git a/python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py b/python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py
new file mode 100644
index 00000000..384799f8
--- /dev/null
+++ b/python/llm/example/CPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py
@@ -0,0 +1,78 @@
+#
+# Copyright 2016 The BigDL Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os
+import time
+import torch
+import argparse
+import requests
+
+from PIL import Image
+from ipex_llm.transformers import AutoModelForCausalLM
+from transformers import AutoTokenizer
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='Predict Tokens using `generate()` API for THUDM/glm-4v-9b model')
+ parser.add_argument('--repo-id-or-model-path', type=str, default="THUDM/glm-4v-9b",
+ help='The huggingface repo id for the THUDM/glm-4v-9b model to be downloaded'
+ ', or the path to the huggingface checkpoint folder')
+ parser.add_argument('--image-url-or-path', type=str,
+ default="http://farm6.staticflickr.com/5268/5602445367_3504763978_z.jpg",
+ help='The URL or path to the image to infer')
+ parser.add_argument('--prompt', type=str, default="What is in the image?",
+ help='Prompt to infer')
+ parser.add_argument('--n-predict', type=int, default=32,
+ help='Max tokens to predict')
+
+ args = parser.parse_args()
+ model_path = args.repo_id_or_model_path
+ image_path = args.image_url_or_path
+
+ # Load model in 4 bit,
+ # which convert the relevant layers in the model into INT4 format
+ model = AutoModelForCausalLM.from_pretrained(model_path,
+ load_in_4bit=True,
+ optimize_model=True,
+ trust_remote_code=True,
+ use_cache=True)
+
+ tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
+
+ query = args.prompt
+ if os.path.exists(image_path):
+ image = Image.open(image_path)
+ else:
+ image = Image.open(requests.get(image_path, stream=True).raw)
+
+ # here the prompt tuning refers to https://huggingface.co/THUDM/glm-4v-9b/blob/main/README.md
+ inputs = tokenizer.apply_chat_template([{"role": "user", "image": image, "content": query}],
+ add_generation_prompt=True,
+ tokenize=True,
+ return_tensors="pt",
+ return_dict=True) # chat mode
+ inputs = inputs.to('cpu')
+
+ # Generate predicted tokens
+ with torch.inference_mode():
+ gen_kwargs = {"max_length": args.n_predict, "do_sample": True, "top_k": 1}
+ st = time.time()
+ outputs = model.generate(**inputs, **gen_kwargs)
+ outputs = outputs[:, inputs['input_ids'].shape[1]:]
+ end = time.time()
+ print(f'Inference time: {end-st} s')
+ output_str = tokenizer.decode(outputs[0])
+ print('-'*20, 'Output', '-'*20)
+ print(output_str)
diff --git a/python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/README.md b/python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/README.md
new file mode 100644
index 00000000..d976b51e
--- /dev/null
+++ b/python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/README.md
@@ -0,0 +1,132 @@
+# GLM-4V
+In this directory, you will find examples on how you could apply IPEX-LLM FP8 optimizations on GLM-4V models on [Intel GPUs](../../../README.md). For illustration purposes, we utilize the [THUDM/glm-4v-9b](https://huggingface.co/THUDM/glm-4v-9b) as a reference GLM-4V model.
+
+## 0. Requirements
+To run these examples with IPEX-LLM on Intel GPUs, we have some recommended requirements for your machine, please refer to [here](../../../README.md#requirements) for more information.
+
+## Example: Predict Tokens using `generate()` API
+In the example [generate.py](./generate.py), we show a basic use case for a GLM-4V model to predict the next N tokens using `generate()` API, with IPEX-LLM FP8 optimizations on Intel GPUs.
+### 1. Install
+#### 1.1 Installation on Linux
+We suggest using conda to manage environment:
+```bash
+conda create -n llm python=3.11
+conda activate llm
+# below command will install intel_extension_for_pytorch==2.1.10+xpu as default
+pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
+
+pip install tiktoken
+```
+
+#### 1.2 Installation on Windows
+We suggest using conda to manage environment:
+```bash
+conda create -n llm python=3.11 libuv
+conda activate llm
+
+# below command will install intel_extension_for_pytorch==2.1.10+xpu as default
+pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
+
+pip install tiktoken
+```
+
+### 2. Configures OneAPI environment variables for Linux
+
+> [!NOTE]
+> Skip this step if you are running on Windows.
+
+This is a required step on Linux for APT or offline installed oneAPI. Skip this step for PIP-installed oneAPI.
+
+```bash
+source /opt/intel/oneapi/setvars.sh
+```
+
+### 3. Runtime Configurations
+For optimal performance, it is recommended to set several environment variables. Please check out the suggestions based on your device.
+#### 3.1 Configurations for Linux
+
diff --git a/python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py b/python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py
new file mode 100644
index 00000000..6a1dd035
--- /dev/null
+++ b/python/llm/example/GPU/HF-Transformers-AutoModels/Model/glm-4v/generate.py
@@ -0,0 +1,81 @@
+#
+# Copyright 2016 The BigDL Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os
+import time
+import torch
+import argparse
+import requests
+
+from PIL import Image
+from ipex_llm.transformers import AutoModelForCausalLM
+from transformers import AutoTokenizer
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='Predict Tokens using `generate()` API for THUDM/glm-4v-9b model')
+ parser.add_argument('--repo-id-or-model-path', type=str, default="THUDM/glm-4v-9b",
+ help='The huggingface repo id for the THUDM/glm-4v-9b model to be downloaded'
+ ', or the path to the huggingface checkpoint folder')
+ parser.add_argument('--image-url-or-path', type=str,
+ default='http://farm6.staticflickr.com/5268/5602445367_3504763978_z.jpg',
+ help='The URL or path to the image to infer')
+ parser.add_argument('--prompt', type=str, default="What is in the image?",
+ help='Prompt to infer')
+ parser.add_argument('--n-predict', type=int, default=32,
+ help='Max tokens to predict')
+
+ args = parser.parse_args()
+ model_path = args.repo_id_or_model_path
+ image_path = args.image_url_or_path
+
+ # Load model in 4 bit,
+ # which convert the relevant layers in the model into INT4 format
+ # When running LLMs on Intel iGPUs for Windows users, we recommend setting `cpu_embedding=True` in the from_pretrained function.
+ # This will allow the memory-intensive embedding layer to utilize the CPU instead of iGPU.
+ model = AutoModelForCausalLM.from_pretrained(model_path,
+ load_in_4bit=True,
+ optimize_model=True,
+ trust_remote_code=True,
+ use_cache=True).half().to('xpu')
+
+ tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
+
+ query = args.prompt
+ if os.path.exists(image_path):
+ image = Image.open(image_path)
+ else:
+ image = Image.open(requests.get(image_path, stream=True).raw)
+
+ # here the prompt tuning refers to https://huggingface.co/THUDM/glm-4v-9b/blob/main/README.md
+ inputs = tokenizer.apply_chat_template([{"role": "user", "image": image, "content": query}],
+ add_generation_prompt=True,
+ tokenize=True,
+ return_tensors="pt",
+ return_dict=True) # chat mode
+ inputs = inputs.to('xpu')
+
+
+ # Generate predicted tokens
+ with torch.inference_mode():
+ gen_kwargs = {"max_length": args.n_predict, "do_sample": True, "top_k": 1}
+ st = time.time()
+ outputs = model.generate(**inputs, **gen_kwargs)
+ outputs = outputs[:, inputs['input_ids'].shape[1]:]
+ end = time.time()
+ print(f'Inference time: {end-st} s')
+ output_str = tokenizer.decode(outputs[0])
+ print('-'*20, 'Output', '-'*20)
+ print(output_str)