前言
随着 ChatGPT 等聊天机器人的风暴席卷全球,生成式预训练 Transformers (GPT) 在开发者中正在成为家喻户晓的新名字。生成式 AI(GenAI) 的发展,尤其是大语言模型和聊天机器人的进步很快、变化不断,很难预测接下来会有什么突破,开发者应该关注什么。我们知道生成式 AI 将继续存在,开发人员希望看到在本地开发、维护和部署 AI 应用程序的更简洁明了的方法。使用 Optimum-Intel 和 OpenVINO™ GenAI 来优化和部署 Hugging Face Transformers 模型,在这里完整说明 AI 模型的分析、优化及部署的步骤。
OpenVINO简介
Intel OpenVINO (Open Visual Inference and Neural Networks Optimization) Toolkit 是一个由英特尔提供的一组优化工具和库,用于加速人工智能 (AI) 和深度学习推理。这个工具包为开发者提供了高度优化的模型转换器、运行时环境以及开发工具,旨在简化 AI 模型在多平台上的部署过程。
主要功能与组件:
-
模型优化:OpenVINO 提供了将模型从不同的机器学习框架(如 TensorFlow, PyTorch, ONNX 等)转换为通用中间表示 (IR) 的工具。然后,可以进一步将此 IR 转换为目标平台上的高效二进制格式,从而实现快速推理。
-
运行时:提供了 OpenVINO 运行时库(Inference Engine),可以在多种硬件平台上执行优化后的模型。这包括从CPU、GPU到NPU等加速器,以获得最佳性能和资源利用。
-
集成与开发工具:
- Model Optimizer: 用于模型转换的高级API。
- Inference Engine: 提供了多平台兼容性,支持多种输入格式,并优化了推理过程。
- Intel CPU, GPU, 和 FPGA 专用插件: 为特定硬件提供高度优化的执行性能。
-
性能优化:通过硬件加速和编译器技术,OpenVINO 可以显著提高模型在目标平台上的运行速度与效率。
-
跨框架支持:允许开发者使用熟悉的机器学习库来训练模型,并通过 OpenVINO 来进行推理部署。
应用场景:
- 视觉应用:如图像分类、对象检测和语义分割。
- 自然语言处理:虽然 OpenVINO 更侧重于视觉任务,但也支持 NLP 的某些任务,如文本分类或情感分析的推理加速。
- 物联网和边缘计算:在低功耗设备上进行实时 AI 推理。
- 自动驾驶:用于视觉感知、目标检测等关键功能。
开发者资源:
Intel 提供了丰富的文档、教程、示例代码和社区支持,帮助开发者快速上手并优化他们的应用。此外,OpenVINO 也与许多主流操作系统(如 Linux 和 Windows)以及开发环境(如 Visual Studio, PyCharm 等)兼容。
配置环境与程序设计
通过 Python API 运行 LLM 文本生成的推理
pip安装源,临时使用样例:pip install xxx -i url
部分国内常见的开源镜像站
镜像站名 网址
清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/
阿里云开源镜像站 http://mirrors.aliyun.com/
中国科学技术大学 http://mirrors.ustc.edu.cn/
网易开源镜像站 http://mirrors.163.com/
搜狐开源镜像 http://mirrors.sohu.com/
浙江大学开源镜像站 http://mirrors.zju.edu.cn/
腾讯开源镜像站 http://mirrors.cloud.tencent.com/pypi/simple
豆瓣开源镜像站 http://pypi.douban.com/simple/
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
conda update -n base -c defaults conda
创建新环境
conda create -n ov-Qwen python=3.10
## Package Plan ##environment location: d:\Users\anaconda3\envs\ov-Qwenadded / updated specs:- python=3.10The following packages will be downloaded:package | build---------------------------|-----------------python-3.10.15 | h4607a30_1 16.2 MB------------------------------------------------------------Total: 16.2 MBThe following NEW packages will be INSTALLED:bzip2 pkgs/main/win-64::bzip2-1.0.8-h2bbff1b_6ca-certificates pkgs/main/win-64::ca-certificates-2024.9.24-haa95532_0libffi pkgs/main/win-64::libffi-3.4.4-hd77b12b_1openssl pkgs/main/win-64::openssl-3.0.15-h827c3e9_0pip pkgs/main/win-64::pip-24.2-py310haa95532_0python pkgs/main/win-64::python-3.10.15-h4607a30_1setuptools pkgs/main/win-64::setuptools-75.1.0-py310haa95532_0sqlite pkgs/main/win-64::sqlite-3.45.3-h2bbff1b_0tk pkgs/main/win-64::tk-8.6.14-h0416ee5_0tzdata pkgs/main/noarch::tzdata-2024b-h04d1e81_0vc pkgs/main/win-64::vc-14.40-h2eaa2aa_1vs2015_runtime pkgs/main/win-64::vs2015_runtime-14.40.33807-h98bb1dd_1wheel pkgs/main/win-64::wheel-0.44.0-py310haa95532_0xz pkgs/main/win-64::xz-5.4.6-h8cc25b3_1zlib pkgs/main/win-64::zlib-1.2.13-h8cc25b3_1Proceed ([y]/n)? yDownloading and Extracting Packages
python-3.10.15 | 16.2 MB | ############################################################################ | 100%
zlib-1.2.13 | 131 KB | ############################################################################ | 100%
pip-24.2 | 2.5 MB | ############################################################################ | 100%
setuptools-75.1.0 | 1.6 MB | ############################################################################ | 100%
tk-8.6.14 | 3.5 MB | ############################################################################ | 100%
vc-14.40 | 10 KB | ############################################################################ | 100%
libffi-3.4.4 | 122 KB | ############################################################################ | 100%
openssl-3.0.15 | 7.8 MB | ############################################################################ | 100%
xz-5.4.6 | 609 KB | ############################################################################ | 100%
wheel-0.44.0 | 138 KB | ############################################################################ | 100%
tzdata-2024b | 115 KB | ############################################################################ | 100%
sqlite-3.45.3 | 973 KB | ############################################################################ | 100%
bzip2-1.0.8 | 90 KB | ############################################################################ | 100%Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate ov-Qwen
#
# To deactivate an active environment, use
#
# $ conda deactivate
激活新环境
(base) C:\Users>conda activate ov-Qwen
安装OpenVINO
pip install openvino-genai==2024.3.0 optimum[openvino]
(ov-Qwen) C:\Users>pip install openvino-genai==2024.3.0 optimum[openvino]
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Collecting openvino-genai==2024.3.0Downloading https://mirrors.aliyun.com/pypi/packages/ce/d4/227290284dfa79eb76100b4b4eef7f7a17e23826800d49922f429bd8a4d4/openvino_genai-2024.3.0.0-cp310-cp310-win_amd64.whl (947 kB)---------------------------------------- 947.8/947.8 kB 8.8 MB/s eta 0:00:00(ov-Qwen) C:\Users>pip install opencv-python jupyter notebook openai appbuilder-sdk qianfan
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Collecting opencv-pythonDownloading https://mirrors.aliyun.com/pypi/packages/ec/6c/fab8113424af5049f85717e8e527ca3773299a3c6b02506e66436e19874f/opencv_python-4.10.0.84-cp37-abi3-win_amd64.whl (38.8 MB)---------------------------------------- 38.8/38.8 MB 11.2 MB/s eta 0:00:00
Qwen2开源模型简介
阿里巴巴通义千问团队发布了Qwen2系列开源模型,Qwen2 是 Qwen 大型语言模型的新系列。对于 Qwen2,我们发布了许多基本语言模型和指令调整语言模型,参数范围从 0.5 到 720 亿个参数不等,包括 Mixture-of-Experts 模型。此存储库包含指令调整的 7B Qwen2 模型。
与最先进的开源语言模型(包括之前发布的 Qwen1.5)相比,Qwen2 总体上超越了大多数开源模型,并在针对语言理解、语言生成、多语言能力、编码、数学、推理等的一系列基准中展示了与专有模型的竞争力。
在此存储库中,我们提供了 GGUF 格式的 fp16 模型和量化模型,包括 q5_0、q5_k_m、q6_k 和 q8_0。
型号详细信息
Qwen2 是一个语言模型系列,包括不同模型大小的解码器语言模型。对于每个大小,我们都会发布基本语言模型和对齐的聊天模型。它基于 Transformer 架构,具有 SwiGLU 激活、注意力 QKV bias、群组查询注意力等。此外,我们还改进了适用于多种自然语言和代码的分词器。
培训详情
我们使用大量数据对模型进行了预训练,并使用监督微调和直接偏好优化对模型进行了后训练。
要求
我们建议您按照官方指南克隆llama.cpp并安装它。我们遵循最新版本的 llama.cpp。在以下演示中,我们假设您在存储库 llama.cpp下运行命令。
安装Python依赖
在启动Qwen2-7B大模型之前,我们首先需要安装Python依赖包列表:
pip install llama-cpp-python
pip install openai
pip install uvicorn
pip install starlette
pip install fastapi
pip install sse_starlette
pip install starlette_context
pip install pydantic_settings
安装ModelScope
pip install modelscope
(ov-Qwen) C:\Users\yuan>pip install modelscope
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Collecting modelscopeDownloading https://mirrors.aliyun.com/pypi/packages/5d/96/fbcdd3015d6a34f78ffbf870ced519bdb961c260e81e90888684f4e768e2/modelscope-1.19.1-py3-none-any.whl (5.8 MB)---------------------------------------- 5.8/5.8 MB 3.0 MB/s eta 0:00:00
Requirement already satisfied: requests>=2.25 in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from modelscope) (2.32.3)
Requirement already satisfied: tqdm>=4.64.0 in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from modelscope) (4.66.5)
Requirement already satisfied: urllib3>=1.26 in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from modelscope) (1.26.20)
Requirement already satisfied: charset-normalizer<4,>=2 in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from requests>=2.25->modelscope) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from requests>=2.25->modelscope) (3.10)
Requirement already satisfied: certifi>=2017.4.17 in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from requests>=2.25->modelscope) (2024.8.30)
Requirement already satisfied: colorama in d:\users\yuan\anaconda3\envs\ov-qwen\lib\site-packages (from tqdm>=4.64.0->modelscope) (0.4.6)
Installing collected packages: modelscope
Successfully installed modelscope-1.19.1
Git模型下载
git clone https://www.modelscope.cn/snake7gun/Qwen2-7B-Instruct-int4-ov.git
admin@desktop MINGW64 /d/software/nvidiacn/openVINO GenAI
$ git clone https://www.modelscope.cn/snake7gun/Qwen2-7B-Instruct-int4-ov.git
Cloning into 'Qwen2-7B-Instruct-int4-ov'...
remote: Enumerating objects: 26, done.
remote: Counting objects: 100% (26/26), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 26 (delta 1), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (26/26), 3.79 MiB | 4.67 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Updating files: 100% (15/15), done.
Filtering content: 100% (3/3), 838.93 MiB | 1.50 MiB/s, done.
conda ov-Qwen 环境 启动Llama大模型
python -m llama_cpp.server --host 0.0.0.0 --model qwen2-7b-instruct-q4_k_m.gguf --n_ctx 204
(ov-Qwen) D:\s\tyqw2-7b>python -m llama_cpp.server --host 0.0.0.0 --model qwen2-7b-instruct-q4_k_m.gguf --n_ctx 204
llama_model_loader: loaded meta data with 26 key-value pairs and 339 tensors from qwen2-7b-instruct-q4_k_m.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = qwen2
llama_model_loader: - kv 1: general.name str = qwen2-7b-instruct
llama_model_loader: - kv 2: qwen2.block_count u32 = 28
llama_model_loader: - kv 3: qwen2.context_length u32 = 32768
llama_model_loader: - kv 4: qwen2.embedding_length u32 = 3584
llama_model_loader: - kv 5: qwen2.feed_forward_length u32 = 18944
llama_model_loader: - kv 6: qwen2.attention.head_count u32 = 28
llama_model_loader: - kv 7: qwen2.attention.head_count_kv u32 = 4
llama_model_loader: - kv 8: qwen2.rope.freq_base f32 = 1000000.000000
llama_model_loader: - kv 9: qwen2.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 10: general.file_type u32 = 15
llama_model_loader: - kv 11: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 12: tokenizer.ggml.pre str = qwen2
llama_model_loader: - kv 13: tokenizer.ggml.tokens arr[str,152064] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 14: tokenizer.ggml.token_type arr[i32,152064] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 15: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 16: tokenizer.ggml.eos_token_id u32 = 151645
llama_model_loader: - kv 17: tokenizer.ggml.padding_token_id u32 = 151643
llama_model_loader: - kv 18: tokenizer.ggml.bos_token_id u32 = 151643
llama_model_loader: - kv 19: tokenizer.chat_template str = {% for message in messages %}{% if lo...
llama_model_loader: - kv 20: tokenizer.ggml.add_bos_token bool = false
llama_model_loader: - kv 21: general.quantization_version u32 = 2
llama_model_loader: - kv 22: quantize.imatrix.file str = ../Qwen2/gguf/qwen2-7b-imatrix/imatri...
llama_model_loader: - kv 23: quantize.imatrix.dataset str = ../sft_2406.txt
llama_model_loader: - kv 24: quantize.imatrix.entries_count i32 = 196
llama_model_loader: - kv 25: quantize.imatrix.chunks_count i32 = 1937
llama_model_loader: - type f32: 141 tensors
llama_model_loader: - type q4_K: 169 tensors
llama_model_loader: - type q6_K: 29 tensors
llm_load_vocab: special tokens cache size = 421
llm_load_vocab: token to piece cache size = 0.9352 MB
llm_load_print_meta: format = GGUF V3 (latest)
llm_load_print_meta: arch = qwen2
llm_load_print_meta: vocab type = BPE
llm_load_print_meta: n_vocab = 152064
llm_load_print_meta: n_merges = 151387
llm_load_print_meta: vocab_only = 0
llm_load_print_meta: n_ctx_train = 32768
llm_load_print_meta: n_embd = 3584
llm_load_print_meta: n_layer = 28
llm_load_print_meta: n_head = 28
llm_load_print_meta: n_head_kv = 4
llm_load_print_meta: n_rot = 128
llm_load_print_meta: n_swa = 0
llm_load_print_meta: n_embd_head_k = 128
llm_load_print_meta: n_embd_head_v = 128
llm_load_print_meta: n_gqa = 7
llm_load_print_meta: n_embd_k_gqa = 512
llm_load_print_meta: n_embd_v_gqa = 512
llm_load_print_meta: f_norm_eps = 0.0e+00
llm_load_print_meta: f_norm_rms_eps = 1.0e-06
llm_load_print_meta: f_clamp_kqv = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: f_logit_scale = 0.0e+00
llm_load_print_meta: n_ff = 18944
llm_load_print_meta: n_expert = 0
llm_load_print_meta: n_expert_used = 0
llm_load_print_meta: causal attn = 1
llm_load_print_meta: pooling type = 0
llm_load_print_meta: rope type = 2
llm_load_print_meta: rope scaling = linear
llm_load_print_meta: freq_base_train = 1000000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_ctx_orig_yarn = 32768
llm_load_print_meta: rope_finetuned = unknown
llm_load_print_meta: ssm_d_conv = 0
llm_load_print_meta: ssm_d_inner = 0
llm_load_print_meta: ssm_d_state = 0
llm_load_print_meta: ssm_dt_rank = 0
llm_load_print_meta: ssm_dt_b_c_rms = 0
llm_load_print_meta: model type = ?B
llm_load_print_meta: model ftype = Q4_K - Medium
llm_load_print_meta: model params = 7.62 B
llm_load_print_meta: model size = 4.36 GiB (4.91 BPW)
llm_load_print_meta: general.name = qwen2-7b-instruct
llm_load_print_meta: BOS token = 151643 '<|endoftext|>'
llm_load_print_meta: EOS token = 151645 '<|im_end|>'
llm_load_print_meta: PAD token = 151643 '<|endoftext|>'
llm_load_print_meta: LF token = 148848 'ÄĬ'
llm_load_print_meta: EOT token = 151645 '<|im_end|>'
llm_load_print_meta: EOG token = 151643 '<|endoftext|>'
llm_load_print_meta: EOG token = 151645 '<|im_end|>'
llm_load_print_meta: max token length = 256
llm_load_tensors: ggml ctx size = 0.15 MiB
llm_load_tensors: CPU buffer size = 4460.45 MiB
...................................................................................
llama_new_context_with_model: n_ctx = 224
llama_new_context_with_model: n_batch = 204
llama_new_context_with_model: n_ubatch = 204
llama_new_context_with_model: flash_attn = 0
llama_new_context_with_model: freq_base = 1000000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init: CPU KV buffer size = 12.25 MiB
llama_new_context_with_model: KV self size = 12.25 MiB, K (f16): 6.12 MiB, V (f16): 6.12 MiB
llama_new_context_with_model: CPU output buffer size = 0.58 MiB
llama_new_context_with_model: CPU compute buffer size = 121.13 MiB
llama_new_context_with_model: graph nodes = 986
llama_new_context_with_model: graph splits = 1
AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | AVX512_BF16 = 0 | FMA = 1 | NEON = 0 | SVE = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | RISCV_VECT = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 |
Model metadata: {'qwen2.attention.head_count': '28', 'general.name': 'qwen2-7b-instruct', 'general.architecture': 'qwen2', 'qwen2.block_count': '28', 'qwen2.context_length': '32768', 'qwen2.attention.head_count_kv': '4', 'quantize.imatrix.dataset': '../sft_2406.txt', 'qwen2.embedding_length': '3584', 'general.quantization_version': '2', 'tokenizer.ggml.bos_token_id': '151643', 'qwen2.feed_forward_length': '18944', 'tokenizer.ggml.padding_token_id': '151643', 'qwen2.rope.freq_base': '1000000.000000', 'qwen2.attention.layer_norm_rms_epsilon': '0.000001', 'tokenizer.ggml.eos_token_id': '151645', 'general.file_type': '15', 'tokenizer.ggml.model': 'gpt2', 'tokenizer.ggml.pre': 'qwen2', 'tokenizer.chat_template': "{% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n' }}{% endif %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}", 'tokenizer.ggml.add_bos_token': 'false', 'quantize.imatrix.chunks_count': '1937', 'quantize.imatrix.file': '../Qwen2/gguf/qwen2-7b-imatrix/imatrix.dat', 'quantize.imatrix.entries_count': '196'}
Available chat formats from metadata: chat_template.default
Using gguf chat template: {% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system
You are a helpful assistant.<|im_end|>
' }}{% endif %}{{'<|im_start|>' + message['role'] + '
' + message['content'] + '<|im_end|>' + '
'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant
' }}{% endif %}
Using chat eos_token: <|im_end|>
Using chat bos_token: <|endoftext|>
[32mINFO[0m: Started server process [[36m11564[0m]
[32mINFO[0m: Waiting for application startup.
[32mINFO[0m: Application startup complete.
[32mINFO[0m: Uvicorn running on [1mhttp://0.0.0.0:8000[0m (Press CTRL+C to quit)
安装 OpenVINO™ 后,您可以开始在 GenAI 和 LLM 模型上运行推理。通过利用此 API,您可以加载模型,向其传递上下文,并仅使用几行代码接收响应。在内部,OpenVINO™ 处理输入文本的标记化,在您选择的设备上执行生成循环,并提供最终响应。
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 23 12:29:01 2024
Optimum-Intel 和 OpenVINO™ GenAI 的结合为在端侧部署 Hugging Face 模型提供了强大而灵活的解决方案。通过遵循这些步骤,您可以在 Python 可能不是理想选择的环境中实现优化的高性能 AI 推理,以确保您的应用在 Intel 硬件上平稳运行。
总结来说,CUDA和OpenVINO的主要区别在于:目标和用途:CUDA主要用于高性能计算和深度学习,而OpenVINO主要用于计算机视觉和深度学习推理。
灵活性:CUDA提供高度的灵活性,允许开发者直接控制GPU架构;而OpenVINO提供高级抽象层,简化了开发过程。
支持的硬件:CUDA主要支持NVIDIA GPU,而OpenVINO支持英特尔平台的硬件加速器。
模型训练与推理:CUDA主要用于模型训练,而OpenVINO主要用于模型推理。
因此,选择CUDA还是OpenVINO取决于具体的应用需求和硬件环境。"""
import openvino_genai as ov_genai
from openvino.runtime import Coredef streamer(subword):print(subword, end='', flush=True)# Return flag corresponds whether generation should be stopped.# False means continue generation.return Falsedef chat_qwen_ov(question):prompt_machine = "<|im_start|>system\n<|im_end|>\n<|im_start|>user\n"+question+"<|im_end|>\n<|im_start|>"result = pipe.generate(prompt_machine)#提示词#prompt = "<|im_start|>system\n<|im_end|>\n<|im_start|>user\n什么是OpenVINO?<|im_end|>\n<|im_start|>"#大模型推理预测#result = pipe.generate(prompt)'''['Assistant: OpenVINO 是一个由英特尔开发的开源计算机视觉和深度学习框架。它提供了一套工具和API,用于在各种设备上部署和优化深度学习模型,特别是针对英特尔硬件(如CPU、GPU和NPU)进行优化。\n\nOpenVINO 的主要功能包括:\n\n1. **模型优化**:它能够将深度学习模型转换为更高效的格式,以便在不同的硬件平台上运行。这包括对模型进行剪枝、量化和转换,以减少计算和内存需求。\n\n2. **运行时**:OpenVINO 提供了一个运行时环境,用于在各种硬件平台上执行优化后的模型。这使得开发者能够轻松地在不同的设备上部署他们的模型,而无需重新编写代码。\n\n3. **支持多种框架**:它支持多种深度学习框架,如 TensorFlow、Caffe、ONNX 等,允许开发者使用他们熟悉的框架来构建模型,然后在 OpenVINO 中进行优化和部署。\n\n4. **视觉API**:除了模型优化和运行时,OpenVINO 还提供了一组视觉API,用于处理图像和视频数据,执行任务如物体检测、图像分类、面部识别等。\n\n5. **性能优化**:OpenVINO 通过利用硬件特定的加速技术,如多线程、异步执行和内存优化,来提高模型的执行速度和效率。\n\n总之,OpenVINO 是一个强大的工具,旨在简化深度学习模型的部署和优化过程,特别是针对英特尔硬件,以实现高性能和高效能的计算机视觉和深度学习应用。']'''return result.texts[0]def main():prompt = input('question:\n')if 'Stop!' == prompt:returnresult = chat_qwen_ov(prompt)print(result)print('\n----------')if '__main__' == __name__:ie = Core()print("使用Core()初始化推理引擎: {}".format(ie))#选择计算设备#device = 'CPU'device = 'GPU'#device = 'NPU'#载入OpenVINO IR格式的大模型pipe = ov_genai.LLMPipeline("Qwen2-7B-Instruct-int4-ov", device)print(chat_qwen_ov("OpenVINO怎么样?"))main()
使用Core()初始化推理引擎: <Core: available plugins[CPU, GPU]>
Assistant: OpenVINO(Open Visual Inference and Neural Networks)是由英特尔开发的一套开源工具和API,用于在各种设备上部署深度学习模型。它主要针对计算机视觉任务,但同时也支持其他类型的神经网络模型。OpenVINO提供了一系列优化工具,可以将训练好的模型转换为高性能的推理引擎,支持在CPU、GPU、VPU(Vision Processing Unit)等不同硬件平台上运行。OpenVINO的特点包括:1. **模型优化**:它能够自动优化模型以适应不同的硬件平台,提高模型的推理速度和效率。
2. **多平台支持**:支持多种硬件平台,包括Intel CPU、Intel GPU、Intel Movidius VPU等,同时也支持其他第三方硬件。
3. **高性能**:通过使用Intel的优化库和编译器技术,OpenVINO能够提供比原始模型更快的推理速度。
4. **API和库**:提供了一系列API和库,方便开发者在不同的编程语言(如C++、Python等)中使用。
5. **模型转换**:支持多种深度学习框架的模型导入,如TensorFlow、ONNX、Caffe等,方便模型的迁移和复用。OpenVINO广泛应用于各种场景,包括但不限于自动驾驶、安防监控、机器人视觉、图像处理等。对于希望在实际设备上部署深度学习模型的开发者和企业来说,OpenVINO是一个强大的工具,能够帮助加速模型的部署过程并提高性能。
question:
软件开发者如何快速入门深度学习?
答案:快速入门深度学习对于软件开发者来说是一个既充满挑战又充满机遇的过程。以下是一些建议,帮助你从零开始学习深度学习:### 1. **理解基础概念**- **数学基础**:学习线性代数、概率论和微积分,这些是深度学习的基础。- **机器学习基础**:理解监督学习、无监督学习、强化学习等基本概念,以及常见的机器学习算法(如线性回归、逻辑回归、决策树等)。### 2. **选择学习资源**- **在线课程**:Coursera、edX、Udacity等平台上有很多深度学习的课程,如Andrew Ng的“机器学习”课程,以及专门的深度学习课程。- **书籍**:《深度学习》(Ian Goodfellow等人著)、《动手学深度学习》(Sebastian Ruder著)等书籍提供了深入的理论和实践指导。- **博客和教程**:关注像Medium、Towards Data Science等平台上的深度学习文章和教程。### 3. **实践项目**- **动手实践**:通过实际项目来加深理解。可以从简单的图像分类任务开始,如使用TensorFlow或PyTorch框架。- **开源项目**:参与或贡献到开源深度学习项目,如TensorFlow、PyTorch或Keras,可以快速提升技能并了解行业实践。### 4. **掌握工具和技术**- **编程语言**:Python是深度学习的首选语言,因为有丰富的库支持,如NumPy、Pandas、Matplotlib等用于数据处理和可视化,以及TensorFlow、PyTorch等用于深度学习。- **框架和库**:熟悉至少一个深度学习框架,如TensorFlow或PyTorch,它们提供了构建和训练模型的便利。### 5. **持续学习和适应**- **社区参与**:加入深度学习相关的社区和论坛,如Reddit的机器学习版块、Stack Overflow等,可以获取帮助和分享经验。- **跟踪最新研究**:关注顶级会议(如ICML、NeurIPS、CVPR)的最新论文和成果,了解深度学习的最新进展。### 6. **解决实际问题**- 尝试解决实际问题,无论是通过参加比赛(如Kaggle上的数据科学比赛)、解决公司内部问题,还是开发个人项目,实践是检验学习成果的最好方式。### 结语
深度学习是一个不断发展的领域,快速入门后,持续学习和实践是关键。通过上述步骤,你可以逐步建立起坚实的深度学习基础,并在实践中不断提升自己的技能。----------
使用 OpenVINO 来进行端侧部署完成
用Ollama管理通义千问2-7B-Instruct-GGUF
Ol llama,全名为“Ollama”,是阿里云推出的一款面向开发者的人工智能助手工具,旨在帮助AI模型开发、部署与管理。对于管理大型语言模型,如GPT-3或通义千问等,Ol llama提供了以下关键功能:
-
代码集成支持:支持将大模型的训练和推理逻辑无缝集成到您的代码中,简化了模型调用流程。
-
API接口服务:
- 文本生成: 提供基于给定提示或输入生成文本的功能。
- 问答系统: 可以用于问答任务,帮助解答用户问题并给出相关答案。
- 语言理解与翻译: 支持对多语言的文本进行理解和转换。
-
训练资源管理:
- Ol llama可能支持通过API直接访问和管理模型训练所需的计算资源(如GPU集群、云服务器等),从而优化训练效率。
- 管理训练任务,包括启动、暂停、恢复或取消训练过程,以及监控训练进度。
-
部署与运行环境配置:
- 提供简单的方式将训练好的大模型部署为在线服务,可以通过API接口访问推理结果。
- 配置和管理推理服务器,包括资源分配(如CPU/GPU资源)、负载均衡、安全性等设置。
-
性能优化与监控:
- 根据实际应用需求调整模型的运行参数以优化性能,例如调整batch size、温度值等超参数。
- 实时监控模型服务的状态和响应时间,对异常进行快速诊断和恢复。
-
安全与合规性:
- 支持安全性相关的设置,如访问控制、数据加密传输、隐私保护等,确保模型的使用符合相关法规要求。
-
资源成本管理:提供费用预估和监控功能,帮助开发者了解和控制训练和运行服务的成本。
通过Ol llama,开发者可以更高效地管理和利用大语言模型资源,减少开发和运维复杂度,专注于构建更高价值的应用。具体操作步骤及API文档可参考阿里云官方提供的指南或API手册获取详细信息。
https://ollama.com/
下载2-7B-Instruct-GGUF
下载网址https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GGUF/files
创建Modelfile.txt文件,写入模型地址
FROM ./qwen2-7b-instruct-q4_k_m.gguf
ollama cmd指令窗口运行该文件,即可运行模型。
基于GGUF模型文件创建Ollama模型,在我们存放Qwen2-7B的 GGUF 模型文件目录中,创建一个文件名为Modelfile的文件,该文件的内容如下:FROM ./qwen2-7b-instruct-q4_k_m.gguf
然后在Terminal终端,使用这个文件创建Ollama模型,这里我把Ollama的模型取名为Qwen2-7B:
$ ollama create Qwen2-7B -f ./Modelfile
transferring model data
using existing layer sha256:24f4471ef69198bf4dbbc4409828341fbd85923319a801035e651d9fe2a7e3c1
creating new layer sha256:24f4471ef69198bf4dbbc4409828341fbd85923319a801035e651d9fe2a7e3c1
writing manifest
success
最后,通过Ollama启动我们刚创建的大语言模型:ollama run Qwen2-7B
# n_ctx=20480代表单次回话最大20480个Token数量
python -m llama_cpp.server --host 0.0.0.0 --model qwen2-7b-instruct-q4_k_m.gguf --n_ctx 20480
(ov-Qwen) D:\software\nvidiacn\tyqw2-7b>python -m llama_cpp.server --host 0.0.0.0 --model qwen2-7b-instruct-q4_k_m.gguf --n_ctx 2048
llama_model_loader: loaded meta data with 26 key-value pairs and 339 tensors from qwen2-7b-instruct-q4_k_m.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = qwen2
llama_model_loader: - kv 1: general.name str = qwen2-7b-instruct
llama_model_loader: - kv 2: qwen2.block_count u32 = 28
llama_model_loader: - kv 3: qwen2.context_length u32 = 32768
llama_model_loader: - kv 4: qwen2.embedding_length u32 = 3584
llama_model_loader: - kv 5: qwen2.feed_forward_length u32 = 18944
llama_model_loader: - kv 6: qwen2.attention.head_count u32 = 28
llama_model_loader: - kv 7: qwen2.attention.head_count_kv u32 = 4
llama_model_loader: - kv 8: qwen2.rope.freq_base f32 = 1000000.000000
llama_model_loader: - kv 9: qwen2.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 10: general.file_type u32 = 15
llama_model_loader: - kv 11: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 12: tokenizer.ggml.pre str = qwen2
llama_model_loader: - kv 13: tokenizer.ggml.tokens arr[str,152064] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 14: tokenizer.ggml.token_type arr[i32,152064] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 15: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 16: tokenizer.ggml.eos_token_id u32 = 151645
llama_model_loader: - kv 17: tokenizer.ggml.padding_token_id u32 = 151643
llama_model_loader: - kv 18: tokenizer.ggml.bos_token_id u32 = 151643
llama_model_loader: - kv 19: tokenizer.chat_template str = {% for message in messages %}{% if lo...
llama_model_loader: - kv 20: tokenizer.ggml.add_bos_token bool = false
llama_model_loader: - kv 21: general.quantization_version u32 = 2
llama_model_loader: - kv 22: quantize.imatrix.file str = ../Qwen2/gguf/qwen2-7b-imatrix/imatri...
llama_model_loader: - kv 23: quantize.imatrix.dataset str = ../sft_2406.txt
llama_model_loader: - kv 24: quantize.imatrix.entries_count i32 = 196
llama_model_loader: - kv 25: quantize.imatrix.chunks_count i32 = 1937
llama_model_loader: - type f32: 141 tensors
llama_model_loader: - type q4_K: 169 tensors
llama_model_loader: - type q6_K: 29 tensors
llm_load_vocab: special tokens cache size = 421
llm_load_vocab: token to piece cache size = 0.9352 MB
llm_load_print_meta: format = GGUF V3 (latest)
llm_load_print_meta: arch = qwen2
llm_load_print_meta: vocab type = BPE
llm_load_print_meta: n_vocab = 152064
llm_load_print_meta: n_merges = 151387
llm_load_print_meta: vocab_only = 0
llm_load_print_meta: n_ctx_train = 32768
llm_load_print_meta: n_embd = 3584
llm_load_print_meta: n_layer = 28
llm_load_print_meta: n_head = 28
llm_load_print_meta: n_head_kv = 4
llm_load_print_meta: n_rot = 128
llm_load_print_meta: n_swa = 0
llm_load_print_meta: n_embd_head_k = 128
llm_load_print_meta: n_embd_head_v = 128
llm_load_print_meta: n_gqa = 7
llm_load_print_meta: n_embd_k_gqa = 512
llm_load_print_meta: n_embd_v_gqa = 512
llm_load_print_meta: f_norm_eps = 0.0e+00
llm_load_print_meta: f_norm_rms_eps = 1.0e-06
llm_load_print_meta: f_clamp_kqv = 0.0e+00
llm_load_print_meta: f_max_alibi_bias = 0.0e+00
llm_load_print_meta: f_logit_scale = 0.0e+00
llm_load_print_meta: n_ff = 18944
llm_load_print_meta: n_expert = 0
llm_load_print_meta: n_expert_used = 0
llm_load_print_meta: causal attn = 1
llm_load_print_meta: pooling type = 0
llm_load_print_meta: rope type = 2
llm_load_print_meta: rope scaling = linear
llm_load_print_meta: freq_base_train = 1000000.0
llm_load_print_meta: freq_scale_train = 1
llm_load_print_meta: n_ctx_orig_yarn = 32768
llm_load_print_meta: rope_finetuned = unknown
llm_load_print_meta: ssm_d_conv = 0
llm_load_print_meta: ssm_d_inner = 0
llm_load_print_meta: ssm_d_state = 0
llm_load_print_meta: ssm_dt_rank = 0
llm_load_print_meta: ssm_dt_b_c_rms = 0
llm_load_print_meta: model type = ?B
llm_load_print_meta: model ftype = Q4_K - Medium
llm_load_print_meta: model params = 7.62 B
llm_load_print_meta: model size = 4.36 GiB (4.91 BPW)
llm_load_print_meta: general.name = qwen2-7b-instruct
llm_load_print_meta: BOS token = 151643 '<|endoftext|>'
llm_load_print_meta: EOS token = 151645 '<|im_end|>'
llm_load_print_meta: PAD token = 151643 '<|endoftext|>'
llm_load_print_meta: LF token = 148848 'ÄĬ'
llm_load_print_meta: EOT token = 151645 '<|im_end|>'
llm_load_print_meta: EOG token = 151643 '<|endoftext|>'
llm_load_print_meta: EOG token = 151645 '<|im_end|>'
llm_load_print_meta: max token length = 256
llm_load_tensors: ggml ctx size = 0.15 MiB
llm_load_tensors: CPU buffer size = 4460.45 MiB
...................................................................................
llama_new_context_with_model: n_ctx = 2048
llama_new_context_with_model: n_batch = 512
llama_new_context_with_model: n_ubatch = 512
llama_new_context_with_model: flash_attn = 0
llama_new_context_with_model: freq_base = 1000000.0
llama_new_context_with_model: freq_scale = 1
llama_kv_cache_init: CPU KV buffer size = 112.00 MiB
llama_new_context_with_model: KV self size = 112.00 MiB, K (f16): 56.00 MiB, V (f16): 56.00 MiB
llama_new_context_with_model: CPU output buffer size = 0.58 MiB
llama_new_context_with_model: CPU compute buffer size = 304.00 MiB
llama_new_context_with_model: graph nodes = 986
llama_new_context_with_model: graph splits = 1
AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | AVX512_BF16 = 0 | FMA = 1 | NEON = 0 | SVE = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | RISCV_VECT = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 |
Model metadata: {'qwen2.attention.head_count': '28', 'general.name': 'qwen2-7b-instruct', 'general.architecture': 'qwen2', 'qwen2.block_count': '28', 'qwen2.context_length': '32768', 'qwen2.attention.head_count_kv': '4', 'quantize.imatrix.dataset': '../sft_2406.txt', 'qwen2.embedding_length': '3584', 'general.quantization_version': '2', 'tokenizer.ggml.bos_token_id': '151643', 'qwen2.feed_forward_length': '18944', 'tokenizer.ggml.padding_token_id': '151643', 'qwen2.rope.freq_base': '1000000.000000', 'qwen2.attention.layer_norm_rms_epsilon': '0.000001', 'tokenizer.ggml.eos_token_id': '151645', 'general.file_type': '15', 'tokenizer.ggml.model': 'gpt2', 'tokenizer.ggml.pre': 'qwen2', 'tokenizer.chat_template': "{% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n' }}{% endif %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}", 'tokenizer.ggml.add_bos_token': 'false', 'quantize.imatrix.chunks_count': '1937', 'quantize.imatrix.file': '../Qwen2/gguf/qwen2-7b-imatrix/imatrix.dat', 'quantize.imatrix.entries_count': '196'}
Available chat formats from metadata: chat_template.default
Using gguf chat template: {% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system
You are a helpful assistant.<|im_end|>
' }}{% endif %}{{'<|im_start|>' + message['role'] + '
' + message['content'] + '<|im_end|>' + '
'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant
' }}{% endif %}
Using chat eos_token: <|im_end|>
Using chat bos_token: <|endoftext|>
[32mINFO[0m: Started server process [[36m20172[0m]
[32mINFO[0m: Waiting for application startup.
[32mINFO[0m: Application startup complete.
[32mINFO[0m: Uvicorn running on [1mhttp://0.0.0.0:8000[0m (Press CTRL+C to quit)
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 23 15:33:46 2024"""from openai import OpenAI# 注意服务端端口,因为是本地,所以不需要api_key
client = OpenAI(base_url="http://localhost:8000/v1",api_key="not-needed")# 对话历史:设定系统角色是一个只能助理,同时提交“自我介绍”问题
history = [{"role": "system", "content": "你是一个智能助理,你的回答总是正确的、有用的和内容非常精简."},{"role": "user", "content": "请用中文进行自我介绍,要求不能超过5句话,总字数不超过100个字。"},
]
print("\033[92;1m")# 首次自我介绍完毕,接下来是等代码我们的提示
while True:completion = client.chat.completions.create(model="local-model",messages=history,temperature=0.7,stream=True,)new_message = {"role": "assistant", "content": ""}for chunk in completion:if chunk.choices[0].delta.content:print(chunk.choices[0].delta.content, end="", flush=True)new_message["content"] += chunk.choices[0].delta.contenthistory.append(new_message)print("\033[91;1m")userinput = input("> ")if userinput.lower() in ["bye", "quit", "exit"]: # 我们输入bye/quit/exit等均退出客户端print("\033[0mBYE BYE!")breakhistory.append({"role": "user", "content": userinput})print("\033[92;1m")
大家好,我是一个智能助手,专注于提供准确、有用且精炼的信息。无论您需要学习、工作还是日常生活中的帮助,我都将全力支持。期待能为您带来便利和解答疑惑!
> OpenVINO怎么样?OpenVINO 是英特尔开发的一款开源软件工具包,专为加速计算机视觉和机器学习应用而设计。它提供了一套完整的编译、优化和部署框架,支持多种硬件平台,使得开发者能够高效地将模型部署到边缘设备或云端。OpenVINO 包括了优化库、模型编译器以及开发工具集,简化了从训练后的模型到实际应用的过渡过程。通过 OpenVINO,可以显著提高推理性能,支持多框架兼容性,并且提供了丰富的文档和社区支持。
> 软件开发者如何快速入门深度学习?软件开发者入门深度学习可遵循以下步骤:1. **了解基础**:首先掌握数学基础知识,特别是线性代数、微积分和概率论;理解机器学习的基本概念和算法。2. **选择工具**:熟悉主流的深度学习框架如 TensorFlow、PyTorch 或 Keras。它们提供了丰富的功能和易于使用的API。3. **实践项目**:通过实际操作解决具体问题,可以从简单任务(如MNIST手写数字识别)开始,逐步过渡到更复杂的任务或领域特定的问题。4. **理论与实践结合**:阅读相关书籍、论文,并结合在线课程进行学习。Coursera、Udacity等平台有适合不同水平的深度学习课程。5. **参与社区和项目**:加入开发者论坛、GitHub项目,或者参加开源项目贡献代码,这有助于加深理解并获取实践经验。6. **持续更新与实践**:AI领域发展迅速,定期阅读论文、关注行业动态,并通过不断的小项目来实践最新的技术。7. **了解应用场景**:深度学习在图像处理、自然语言处理等领域有广泛的应用。明确你的兴趣所在,并深入了解该领域的最新进展和应用案例。通过上述步骤系统性地学习和实践,能够帮助软件开发者快速掌握深度学习技能。
> bye
BYE BYE!
安装Ollama Web UI 精简版
Ollama Web UI Lite 是 Ollama Web UI 的简化版本,旨在提供简化的用户界面,具有最少的功能和更低的复杂性。该项目的主要重点是通过完整的 TypeScript 迁移实现更清晰的代码,采用更加模块化的架构,确保全面的测试覆盖率,并实施强大的 CI/CD 管道。
当前版本仅包含完整 Ollama Web UI 中的基本功能,例如拉取和删除模型、与一个或多个模型进行对话、聊天导入/导出等。
git clone https://github.com/ollama-webui/ollama-webui-lite
MINGW64 /g/openai
$ git clone https://github.com/ollama-webui/ollama-webui-lite
Cloning into 'ollama-webui-lite'...
remote: Enumerating objects: 313, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 313 (delta 20), reused 15 (delta 15), pack-reused 276 (from 1)
Receiving objects: 100% (313/313), 6.86 MiB | 3.32 MiB/s, done.
Resolving deltas: 100% (113/113), done.
PS G:\openai\ollama-webui-lite> npm run dev
> ollama-webui-lite@0.0.1 dev
> vite dev --host --port 3000VITE v4.5.5 ready in 2917 ms➜ Local: http://localhost:3000/➜ Network: http://192.168.1.2:3000/➜ press h to show help
用浏览器访问应用,选择Qwen2-7B模型
{"model":"Qwen2-7B:latest","prompt":"Generate a brief 3-5 word title for this question, excluding the term 'title.' Then, please reply with only the title: OpenVINO怎么样?","stream":false}{"model": "Qwen2-7B:latest","created_at": "2024-10-24T04:38:51.2599221Z","response": "OpenVINO评价如何?\nOpenVINO使用体验分享","done": true,"done_reason": "stop","context": [151644,872,198,31115,264,9814,220,18,12,20,3409,2265,369,419,3405,11,43778,279,4647,364,2102,3159,5005,11,4486,9851,448,1172,279,2265,25,5264,53,47975,104472,11319,151645,198,151644,77091,198,5002,53,47975,103964,100007,94432,5002,53,47975,37029,101904,93149],"total_duration": 1053661700,"load_duration": 33092900,"prompt_eval_count": 41,"prompt_eval_duration": 301770000,"eval_count": 13,"eval_duration": 717216000
}
const sendPromptOllama = async (model, userPrompt, parentId, _chatId) => {console.log("sendPromptOllama");let responseMessageId = uuidv4();let responseMessage = {parentId: parentId,id: responseMessageId,childrenIds: [],role: "assistant",content: "",model: model};history.messages[responseMessageId] = responseMessage;history.currentId = responseMessageId;if (parentId !== null) {history.messages[parentId].childrenIds = [...history.messages[parentId].childrenIds,responseMessageId];}await tick();window.scrollTo({ top: document.body.scrollHeight });const res = await fetch(`${$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL}/chat`, {method: "POST",headers: {"Content-Type": "text/event-stream"},body: JSON.stringify({model: model,messages: messages.map((message) => ({role: message.role,content: message.content})),options: {seed: $settings.seed ?? undefined,temperature: $settings.temperature ?? undefined,repeat_penalty: $settings.repeat_penalty ?? undefined,top_k: $settings.top_k ?? undefined,top_p: $settings.top_p ?? undefined,num_ctx: $settings.num_ctx ?? undefined,...($settings.options ?? {})},format: $settings.requestFormat ?? undefined})}).catch((err) => {console.log(err);return null;});if (res && res.ok) {const reader = res.body.pipeThrough(new TextDecoderStream()).pipeThrough(splitStream("\n")).getReader();while (true) {const { value, done } = await reader.read();if (done || stopResponseFlag || _chatId !== $chatId) {responseMessage.done = true;messages = messages;break;}try {let lines = value.split("\n");for (const line of lines) {if (line !== "") {console.log(line);let data = JSON.parse(line);if ("detail" in data) {throw data;}if (data.done == false) {if (responseMessage.content == "" && data.message.content == "\n") {continue;} else {responseMessage.content += data.message.content;messages = messages;}} else {responseMessage.done = true;responseMessage.context = data.context ?? null;responseMessage.info = {total_duration: data.total_duration,load_duration: data.load_duration,sample_count: data.sample_count,sample_duration: data.sample_duration,prompt_eval_count: data.prompt_eval_count,prompt_eval_duration: data.prompt_eval_duration,eval_count: data.eval_count,eval_duration: data.eval_duration};messages = messages;if ($settings.responseAutoCopy) {copyToClipboard(responseMessage.content);}}}}} catch (error) {console.log(error);if ("detail" in error) {toast.error(error.detail);}break;}if (autoScroll) {window.scrollTo({ top: document.body.scrollHeight });}await $db.updateChatById(_chatId, {title: title === "" ? "New Chat" : title,models: selectedModels,options: {seed: $settings.seed ?? undefined,temperature: $settings.temperature ?? undefined,repeat_penalty: $settings.repeat_penalty ?? undefined,top_k: $settings.top_k ?? undefined,top_p: $settings.top_p ?? undefined,num_ctx: $settings.num_ctx ?? undefined,...($settings.options ?? {})},messages: messages,history: history});}} else {if (res !== null) {const error = await res.json();console.log(error);if ("detail" in error) {toast.error(error.detail);responseMessage.content = error.detail;} else {toast.error(error.error);responseMessage.content = error.error;}} else {toast.error(`Uh-oh! There was an issue connecting to Ollama.`);responseMessage.content = `Uh-oh! There was an issue connecting to Ollama.`;}responseMessage.error = true;responseMessage.content = `Uh-oh! There was an issue connecting to Ollama.`;responseMessage.done = true;messages = messages;}stopResponseFlag = false;await tick();if (autoScroll) {window.scrollTo({ top: document.body.scrollHeight });}if (messages.length == 2 && messages.at(1).content !== "") {window.history.replaceState(history.state, "", `/c/${_chatId}`);await generateChatTitle(_chatId, userPrompt);}};
Ollama Qwen2-7B:latest
对于软件开发者来说,想要快速入门深度学习,可以遵循以下几个步骤:1. 了解基本概念首先需要理解机器学习的基础理论,特别是监督学习、无监督学习和强化学习的概念。然后深入研究深度学习的核心思想——神经网络模型,包括前向传播、反向传播等机制。2. 选择适合的学习资源在线课程: Coursera、Udacity、edX等平台提供了大量深度学习的入门和进阶课程。书籍: 建议阅读《深度学习》(Ian Goodfellow, Yoshua Bengio & Aaron Courville)、《Python深度学习》(Francois Chollet)等经典作品。博客/论坛: TensorFlow、PyTorch官方文档和社区,Stack Overflow,Medium上的技术博主分享的文章。3. 实践编程实际动手是掌握任何技术的关键。以下是一个简单的实践步骤:选择深度学习框架:建议初学者从TensorFlow或PyTorch开始,这两个框架都是功能强大且广泛应用的。尝试简单的项目: 开始可以从“Hello World”级别的项目做起,例如用MNIST数据集实现一个手写数字识别模型。网上有很多现成的教学代码和教程可以帮助你快速上手。参与开源项目: GitHub上有许多深度学习相关的开源项目,通过为这些项目贡献代码或研究新功能,可以加深对深度学习的理解。4. 关注行业趋势深度学习是一个快速发展且不断更新的领域。了解最新的研究成果、技术趋势和应用实例对于提升技能至关重要。可以通过阅读学术论文、参加研讨会和讲座等方式来保持知识的时效性。5. 建立项目实践将所学应用于实际问题上是检验学习成果的有效方法。可以从解决现实生活中的问题开始,如图像分类、自然语言处理任务等,逐步增加项目的复杂度和挑战性。6. 加入社区深入深度学习的社区可以让你获得更多的知识和技术帮助。可以参加线上或线下的深度学习研讨会、交流会以及参与相关论坛讨论。通过上述步骤,软件开发者将能够系统地学习并实践深度学习,从而在这一领域建立坚实的基础和技能。
参见:
intel openvino 2024-2
Qwen2-7B-Instruct-GGUF 魔搭社区
OpenVINO_DLWorkbench_JackHsu.pdf