1. Ollama 模型性能对比

为了解决这个问题,找很多 ollama 的资料,基本上可以确定 3 点信息:

  1. ollama 会自动适配可用英伟达(NVIDIA)显卡。若显卡资源没有被用上应该是显卡型号不支持导致的。如下图:

image.png

  1. ollama 支持 AMD 显卡的使用,如下图:

image.png

  1. 至于 Apple 用户 ollama 也开始支持 Metal GPUs 方案

image.png

欸…看到这里好像又有点希望了,我的 MBP 估计也支持 Metal 方案吧🤔,接着我就到 Apple 官网查了一下 Metal 的支持情况。如下图:

image.png

(其实 ollama 上说的支持 Metal GPUs 的方案指的是使用 M 系列芯片的 Apple 用户,像我这种 Intel 芯的是不支持的。可惜这个我是后来才知道的,现在的这个 moment 我还抱有一丝的幻想😭…)

当时我就陷入自我怀疑了,难道是预量化模型的缘故只能适配到 CPU ?带着这个疑问又下载了一个 Qwen chat 版本进行了同环境的对比验证,如下图:

# 使用 ollama 调取 chat 版本模型(qwen:14b-chat-q4_K_M),耗时 69 秒

(transformer) (base) MacBook-Pro:python yuanzhenhui$ /Users/yuanzhenhui/anaconda3/envs/transformer/bin/python /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/learning/local_model.py
>>> function ollama_transfor_msg totally use 69.74513030052185 seconds
>>> 是的,中医理论可以解释并尝试解决这些症状。
全身乏力和心跳过速可能是由多种原因引起的。在中医看来,这可能与脏腑功能失调、气血不畅、阴阳失衡等因素有关。
例如,心气不足可能导致心跳过速,而脾虚则可能导致全身乏力。另外,如果肝脏的功能不好,也可能导致这种症状。
因此,治疗方案可能会根据你的具体情况进行调整,可能包括中药、针灸、推拿等方法。同时,中医强调调养身体的整体健康,包括饮食习惯、生活方式等方面,也会对改善这些症状有帮助。

# 使用 ollama 调取 gguf 版本模型(qwen:14b-chat-q4_K_M),耗时 90 秒

(transformer) (base) MacBook-Pro:python yuanzhenhui$ /Users/yuanzhenhui/anaconda3/envs/transformer/bin/python /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/learning/local_model.py
>>> function ollama_transfor_msg totally use 90.6007969379425 seconds
>>>  中国传统医学,也就是中医,对于全身乏力和心跳过速等症状有自己的理论解释和治疗方案。
1. 全身乏力:中医认为这是“气虚”或者“阳虚”的表现。气是维持人体生命活动的物质基础,如果气不足,就会出现乏力、疲劳等症状。可能的原因包括饮食不当、劳累过度、久病体弱等。中医会通过调理饮食,增加营养,适当运动,以及服用补气的药物来改善。
2. 心跳过速:中医将其称为“心悸”或“心动过速”,可能与心脏气血不足、心阴亏损或者有某些病理因素如痰饮、瘀血等有关。中医治疗会根据具体病因采用益气养阴、化痰活血的方法,有时还会使用中药如炙甘草汤、归脾汤等。
然而,值得注意的是,虽然中医理论能够解释和在一定程度上处理这些症状,但在现代医学中,全身乏力伴随心跳过速也可能是心脏疾病(如心律失常)或其他疾病的症状。如果患者持续出现这些症状,应尽快就医,由专业医生进行诊断和治疗。

两者相差 20 秒,并且两次调用均未使用系统 GPU 资源进行推理。 使用一般 chat 版本在仅使用 CPU 算力的情况下比 gguf 版本响应速度更快?这貌似不太合理,但无论怎么样 69 秒还是有点慢了。到这一步可能有人会说,你穷就不要要求那么高了,本来人工智能就是要花钱的,有钱你上个外置显卡不就可以快了吗。

2. 基于 transformers 实现

难道只能这样结束了吗?No!

到目前为止能够确定的是:

  1. Metal 只支持 M系列芯片与 Intel 无缘
  2. 受限于硬件性能大参数模型无法在短时间内响应

为了满足以上条件,我这里选用 Qwen/Qwen1.5-0.5B-Chat 模型直接通过 transformers 进行部署,如下图:

...
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

pt_device = torch.device("cpu")
# 模型名称
pt_model_name = "Qwen/Qwen1.5-0.5B-Chat"
# 使用 pytorch 方式加载模型
pt_model = AutoModelForCausalLM.from_pretrained(
    pt_model_name,
    torch_dtype="auto",
    device_map="auto"
)
# 加载分词器
pt_tokenizer = AutoTokenizer.from_pretrained(pt_model_name)

# 给模型一个人设定位
sys_content = "You are a helpful assistant and also a senior expert in the traditional Chinese medicine industry. You are very willing to provide me with detailed opinions to help me grow."

"""
为PyTorch模型生成输入。

此函数以消息列表和批处理大小为输入。它使用pt_tokenizer将聊天模板应用于消息,禁用标记化并添加生成提示。然后使用pt_tokenizer对生成的文本进行标记化,并将其填充到指定的批处理大小。标记化的输入随后被转换为PyTorch张量并移动到pt_device。

Parameters:
    messages (List[Dict[str, str]]): 表示对话历史的字典列表。每个字典应该有键“角色”和“内容”。
    batch_size (int): 输入所需的批量大小。

Returns:
    torch.Tensor: PyTorch模型的输入张量,形状为(批量大小,序列长度)。
"""

def pt_model_input(messages):
    text = pt_tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    return pt_tokenizer([text], return_tensors="pt").to(pt_device)

"""
将给定的消息转换为PyTorch模型输入,并使用该模型生成文本。

Parameters:
    messages (List[Dict[str, str]]): 表示对话历史的字典列表。每个字典应该有键“角色”和“内容”。
    batch_size (int, optional): 输入所需的批量大小。默认为4。

Returns:
    str: 从 PyTorch 模型生成的文本。

Note:
    - 此函数使用pt_tokenizer将聊天模板应用于消息,禁用标记化并添加生成提示。
    - 然后使用pt_tokenizer对得到的文本进行标记,并填充到指定的批量大小。
    - 将标记化的输入转换为PyTorch张量并移动到pt_device。
    - PyTorch模型根据输入生成文本。
    - 生成的文本使用pt_tokenizer进行解码,并跳过特殊标记。
    - 仅返回第一个生成的文本。
"""

def pt_transfor_msg(messages):
    start_time = time.time()
    response_text = ''
    try:
        model_inputs = pt_model_input(messages)
        generated_ids = pt_model.generate(model_inputs.input_ids,max_new_tokens=1024)
        generated_ids = [
            output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
        ]
        response_text = pt_tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    except Exception as e:
        print(f"Error: {e}")
    finally:
        execution_time = time.time() - start_time
        print(f">>> function pt_transfor_msg totally use {execution_time} seconds")
    return response_text

# 预执行一次去加载模型到内存
_ = pt_transfor_msg([{"role": "user", "content": "Hello"}])

"""
根据给定的提示,使用PyTorch和Qwen模型生成响应。

Parameters:
    prompt (str): 生成响应的用户输入提示。

Returns:
    str: 生成的响应文本。

Note:
    - 此函数使用pt_tokenizer将聊天模板应用于消息,禁用标记化并添加生成提示。
    - 然后使用pt_tokenizer对得到的文本进行标记,并填充到指定的批量大小。
    - 将标记化的输入转换为PyTorch张量并移动到pt_device。
    - PyTorch模型根据输入生成文本。
    - 生成的文本使用pt_tokenizer进行解码,并跳过特殊标记。
    - 仅返回第一个生成的文本。
"""

def pt_qwen_text(prompt):
    messages = [
        {"role": "system", "content": sys_content},
        {"role": "user", "content": prompt}
    ]
    return pt_transfor_msg(messages)

if __name__ == '__main__':
    prompt = "中医药理论是否能解释并解决全身乏力伴随心跳过速的症状?"
    response = pt_qwen_text(prompt)
    print(">>> "+response)

这段代码跟之前的代码没有太大的区别,还是用一般的 chat 模型,但是为了加快响应速度,这里预先做了一次“提问”预热。

_ = pt_transfor_msg([{"role": "user", "content": "Hello"}])

通过提问将模型加载到内存里面,之后再进行问题提问就会稍微快一些,如下图:

(transformer) (base) MacBook-Pro:python yuanzhenhui$ /Users/yuanzhenhui/anaconda3/envs/transformer/bin/python /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/learning/local_model.py
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
>>> function pt_transfor_msg totally use 30.924490928649902 seconds
>>> 中医药理论中的一些概念,如阴阳五行、脏腑经络等,可能在理解这些症状的根源上有一定的帮助。但是,具体的病因和治疗方案需要通过中医医生的专业判断来确定。
一般来说,全身乏力伴心跳过速可能是由于多种原因引起的,包括心肌梗死、心脏疾病、高血压、心脏病发作等。因此,中医理论不能简单地应用到所有的病症上,只能提供一些基本的诊断和治疗方法。
如果想要找出具体的病因,可以考虑通过检查血液中的糖水平、血压、血脂等指标,或者通过专业的医疗影像学检查,如心电图、X光片等。如果诊断结果显示没有心脏问题,那么可能是由其他原因引起的心力衰竭或糖尿病等慢性病所导致。
总的来说,虽然中医理论在一定程度上可能有助于理解一些疾病的发病机制,但并不是所有的问题都可以用中医方法解决。同时,中医治疗通常需要个体化的调整,不能代替药物治疗。

耗时 30 秒,通过缩减模型参数的方式将响应时间缩减到原来的一半。这种方式直接用于文本生成(text-generation)还是有点勉强的,但是如果只是用来做语意分析的话因为问题不大。

此外,有尝试过使用 ctransformers 来部署 gguf 模型,结果发现并不是所有的 gguf 模型都能够正常地部署。由于一直没有尝试到想要的结果因此先暂时放弃。

3. 基于 OpenVINO 实现

OpenVINO 是一个开源工具包,用于优化和部署从云端到边缘的深度学习模型。开源公司是 Intel…是的,没有看错就是 Intel。详细的介绍如下我就不多说了:

OpenVINO 2024.1 — OpenVINO™ documentation

OpenVINO(以下简称“vino”)不能直接使用 transformers 实现,在 huggingface 中我们可以直接在 Libraries 分类中选择“OpenVINO”来筛选出别人已经编译好的模型,但是中文模型实在太少了(只有一个)。接下来给我们的就只有两条路,一个是通过 save_pretrained 先将模型下载到本地,然后再通过 OpenVINO Toolkit 进行转换:

www.intel.cn/content/www…

但这样过于麻烦了,折腾到现在我只想将整个实现达到可容忍的范围内就可以了。于是我选择了另一种方案,采用 Optimum Intel 插件来调用 OpenVINO Runtime 运行推理。

先安装 optimum 插件,如下图:

(transformer) (base) MacBook-Pro:python yuanzhenhui$ pip install optimum[openvino]
Requirement already satisfied: optimum[openvino] in /Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages (1.19.1)
...
Installing collected packages: ninja, jstyleson, grapheme, wrapt, threadpoolctl, tabulate, rpds-py, pyparsing, pygments, openvino, natsort, mdurl, kiwisolver, future, fonttools, cycler, contourpy, cma, about-time, tiktoken, scikit-learn, referencing, pydot, openvino-tokenizers, matplotlib, markdown-it-py, Deprecated, autograd, alive-progress, rich, pymoo, jsonschema-specifications, jsonschema, nncf
  Attempting uninstall: openvino
    Found existing installation: openvino 2023.3.0
    Uninstalling openvino-2023.3.0:
      Successfully uninstalled openvino-2023.3.0
Successfully installed Deprecated-1.2.14 about-time-4.2.1 alive-progress-3.1.5 autograd-1.6.2 cma-3.2.2 contourpy-1.2.1 cycler-0.12.1 fonttools-4.51.0 future-1.0.0 grapheme-0.6.0 jsonschema-4.22.0 jsonschema-specifications-2023.12.1 jstyleson-0.0.2 kiwisolver-1.4.5 markdown-it-py-3.0.0 matplotlib-3.8.4 mdurl-0.1.2 natsort-8.4.0 ninja-1.11.1.1 nncf-2.10.0 openvino-2024.1.0 openvino-tokenizers-2024.1.0.0 pydot-2.0.0 pygments-2.18.0 pymoo-0.6.1.1 pyparsing-3.1.2 referencing-0.35.1 rich-13.7.1 rpds-py-0.18.1 scikit-learn-1.4.2 tabulate-0.9.0 threadpoolctl-3.5.0 tiktoken-0.6.0 wrapt-1.16.0

由于在其他尝试的时候已经将部分依赖安装了,所以整个 optimum 安装非常的快。接下来就可以编写调用代码了,如下图:

import time

import torch
from optimum.intel.openvino import OVModelForCausalLM
from transformers import AutoModelForCausalLM, AutoTokenizer

# 模型名称
pt_model_name = "Qwen/Qwen1.5-0.5B-Chat"

# 给模型一个人设定位
sys_content = "You are a helpful assistant and also a senior expert in the traditional Chinese medicine industry. You are very willing to provide me with detailed opinions to help me grow."

# 判断当前是否有 GPU,如果有则使用 GPU,否则使用 CPU
if torch.cuda.is_available():
    pt_device = torch.device("cuda")
else:
    pt_device = torch.device("cpu")

"""
为因果语言模型初始化 OpenVINO 优化模型和标记器。
此函数为“pt_model_name”指定的因果语言模型加载 OpenVINO 优化模型和标记器。它将全局变量“opt_model”和“opt_tokenizer”分别设置为初始化的模型和标记器。

Parameters:
    None

Returns:
    None

Side Effects:
    - 修改全局变量“opt_model”和“opt_tokenizer”。
    - 使用默认消息调用函数“opt_transform_msg”。

Raises:
    None
"""
def opt_init_model():
    global opt_model, opt_tokenizer
    opt_model = OVModelForCausalLM.from_pretrained(
        pt_model_name, 
        export=True, 
        trust_remote_code=True,
        offload_folder="offload", 
        offload_state_dict=True, 
        torch_dtype="auto",
        device_map="auto"
        )
    opt_tokenizer = AutoTokenizer.from_pretrained(pt_model_name)
    
    _ = opt_transfor_msg([{"role": "user", "content": "Hello"}])

def opt_model_input(messages):
    text = opt_tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    model_inputs = opt_tokenizer([text], return_tensors="pt").to(pt_device)
    input_ids = opt_tokenizer.encode(text, return_tensors='pt')
    attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=pt_device)
    return model_inputs, attention_mask

"""
根据给定的消息生成 OpenVINO 模型的输入。

Parameters:
    messages (List[Dict[str, str]]): 表示消息的字典列表。每个字典应该有“角色”和“内容”键。

Returns:
    Tuple[Dict[str, torch.Tensor], torch.Tensor]: 一个包含模型输入和注意力掩码的元组。
        - 模型输入是一个包含以下键的字典:
            - "input_ids": 一个形状为(批量大小,序列长度)的张量,包含分词后的输入id。
        - 注意力掩码是一个形状为(批量大小,序列长度)的张量,其中包含注意力掩码值。

Raises:
    None
"""

def opt_transfor_msg(messages):
    start_time = time.time()
    response_text = ''
    try:
        model_inputs, attention_mask = opt_model_input(messages)
        generated_ids = opt_model.generate(
            model_inputs.input_ids,
            attention_mask=attention_mask,
            max_new_tokens=1024,
            pad_token_id=opt_tokenizer.eos_token_id
        )
        generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
        response_text = opt_tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    except Exception as e:
        print(f"Error: {e}")
    finally:
        execution_time = time.time() - start_time
        print(f">>> function opt_transfor_msg totally use {execution_time} seconds")
    return response_text

"""
使用OpenAI文本生成模型生成文本响应。

Parameters:
    prompt (str): 用于生成响应的输入文本提示。

Returns:
    str: 生成的文本响应。

Raises:
    None
"""

def opt_qwen_text(prompt):
    messages = [
        {"role": "system", "content": sys_content},
        {"role": "user", "content": prompt}
    ]
    return opt_transfor_msg(messages)

if __name__ == '__main__':
    prompt = "中医药理论是否能解释并解决全身乏力伴随心跳过速的症状?"
    opt_init_model()
    response = opt_qwen_text(prompt)
    print(">>> "+response)

以下是执行的情况,如下图:

(base) MacBook-Pro:python yuanzhenhui$ /Users/yuanzhenhui/anaconda3/envs/transformer/bin/python /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/learning/local_model.py

# 首先系统会监测我是否安装好必须的插件
INFO:nncf:NNCF initialized successfully. Supported frameworks detected: torch, onnx, openvino

# 发现我并没有GPU的资源可用,这个是警告可以不用管
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/bitsandbytes/cextension.py:34: UserWarning: The installed version of bitsandbytes was compiled without GPU support. 8-bit optimizers, 8-bit multiplication, and GPU quantization are unavailable.
  warn("The installed version of bitsandbytes was compiled without GPU support. "
'NoneType' object has no attribute 'cadam32bit_grad_fp32'

# 采用 export 参数将模型导出
Framework not specified. Using pt to export the model.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.

# 使用 pytorch 2.1.2 进行导出,以下的都是警告可以忽略,不影响使用
Using framework PyTorch: 2.1.2
Overriding 1 configuration item(s)
        - use_cache -> True
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/transformers/modeling_utils.py:4371: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead
  warnings.warn(
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/transformers/modeling_attn_mask_utils.py:114: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
  if (input_shape[-1] > 1 or self.sliding_window is not None) and self.is_causal:
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/optimum/exporters/onnx/model_patcher.py:300: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
  if past_key_values_length > 0:
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/transformers/models/qwen2/modeling_qwen2.py:121: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
  if seq_len > self.max_seq_len_cached:
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/transformers/models/qwen2/modeling_qwen2.py:681: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!
  if attention_mask.size() != (bsz, 1, q_len, kv_seq_len):

# 通过 CPU 进行编译
Compiling the model to CPU ...
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
>>> function opt_transfor_msg totally use 0.9080860614776611 seconds
>>> function opt_transfor_msg totally use 12.55846905708313 seconds
>>> 中医药理论认为,全身乏力伴随心跳过速的症状可能与多种因素有关,包括体质、环境、疾病等。以下是一些可能的原因:
1. 身质因素:体质虚弱的人群,如老年人、慢性疾病患者、免疫力低下的人等,可能会出现全身乏力、心跳过速等症状。
2. 环境因素:环境因素如过度劳累、情绪波动、饮食不规律等,也可能导致全身乏力、心跳过速等症状。
3. 疾病因素:某些疾病,如心脏病、糖尿病、高血压等,可能会导致全身乏力、心跳过速等症状。
4. 其他因素:如药物副作用、药物过敏、药物滥用等,也可能导致全身乏力、心跳过速等症状。
因此,中医理论不能简单地解释并解决全身乏力伴随心跳过速的症状,需要结合具体的体质、环境、疾病等多方面因素进行综合分析和治疗。同时,中医治疗也强调调整生活习惯,如保持良好的饮食习惯、规律的作息、适量的运动等,以改善身体状况。

通过使用 vino 居然将响应速度提升到 13 秒内。又在 transformers 的基础上提升了 50% 以上,在只有纯 CPU 资源的情况下还算是可以的了。但我又稍微将代码进行以下调整:

...
# 通过使用 padding 和 truncation 参数,可以确保输入文本在传递给模型之前具有统一的长度。这对于批处理和并行计算非常重要,因为模型需要接收形状一致的输入。
def opt_model_input(messages):
    text = opt_tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    model_inputs = opt_tokenizer(text, return_tensors="pt", padding=True, truncation=True).to(pt_device)
    return model_inputs

...

def opt_transfor_msg(messages):
    start_time = time.time()
    response_text = ''
    try:
        model_inputs = opt_model_input(messages)
        generated_ids = opt_model.generate(
            model_inputs.input_ids,
            attention_mask=model_inputs.attention_mask,
            max_new_tokens=512,
            num_beams=1, # 这里设置为1以加快推理速度
            pad_token_id=opt_tokenizer.eos_token_id
        )
        response_text = opt_tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    except Exception as e:
        print(f"Error: {e}")
    finally:
        execution_time = time.time() - start_time
        print(f">>> function opt_transfor_msg totally use {execution_time} seconds")
    return response_text

执行的效果如下:

...
Compiling the model to CPU ...
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
>>> function opt_transfor_msg totally use 0.9006850719451904 seconds
>>> function opt_transfor_msg totally use 11.58049988746643 seconds
>>> system
You are a helpful assistant and also a senior expert in the traditional Chinese medicine industry. You are very willing to provide me with detailed opinions to help me grow.
user
中医药理论是否能解释并解决全身乏力伴随心跳过速的症状?
assistant
中医药理论认为,全身乏力伴随心跳过速的症状可能与多种因素有关,包括体质、环境、疾病等。以下是一些可能的原因:
1. 身质因素:体质虚弱的人群,如老年人、慢性疾病患者、免疫力低下的人等,可能会出现全身乏力、心跳过速等症状。
2. 环境因素:环境因素如过度劳累、情绪波动、饮食不规律等,也可能导致全身乏力、心跳过速等症状。
3. 疾病因素:某些疾病,如心脏病、糖尿病、高血压等,可能会导致全身乏力、心跳过速等症状。
4. 其他因素:如药物副作用、药物过敏、药物滥用等,也可能导致全身乏力、心跳过速等症状。
因此,中医理论不能简单地解释并解决全身乏力伴随心跳过速的症状,需要结合具体的体质、环境、疾病等多方面因素进行综合分析和治疗。同时,中医治疗也强调调整生活习惯,如保持良好的饮食习惯、规律的作息、适量的运动等,以改善身体状况。


可以将执行时间压缩到 12 秒内。至此,基于 Intel 的 CPU Only 方案基本上结束了。由于最终也是使用 Qwen/Qwen1.5-0.5B-Chat 模型,因此就以 Qwen/Qwen1.5-0.5B-Chat 进行一下总结,为此我又用 ollama 重新下载了 Qwen/Qwen1.5-0.5B-Chat 进行对比,如下图:

(base) yuanzhenhui@MacBook-Pro ~ % ollama pull qwen:0.5b-chat
pulling manifest 
pulling fad2a06e4cc7... 100% ▕███████████████████████████████████████████████████████████████████████████████████▏ 394 MB                         
pulling 41c2cf8c272f... 100% ▕███████████████████████████████████████████████████████████████████████████████████▏ 7.3 KB                         
pulling 1da0581fd4ce... 100% ▕███████████████████████████████████████████████████████████████████████████████████▏  130 B                         
pulling f02dd72bb242... 100% ▕███████████████████████████████████████████████████████████████████████████████████▏   59 B                         
pulling ea0a531a015b... 100% ▕███████████████████████████████████████████████████████████████████████████████████▏  485 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success 

---

(base) MacBook-Pro:python yuanzhenhui$ /Users/yuanzhenhui/anaconda3/envs/transformer/bin/python /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/learning/local_model.py
INFO:nncf:NNCF initialized successfully. Supported frameworks detected: torch, onnx, openvino
/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/bitsandbytes/cextension.py:34: UserWarning: The installed version of bitsandbytes was compiled without GPU support. 8-bit optimizers, 8-bit multiplication, and GPU quantization are unavailable.
  warn("The installed version of bitsandbytes was compiled without GPU support. "
'NoneType' object has no attribute 'cadam32bit_grad_fp32'
>>> function ollama_transfor_msg totally use 4.856121063232422 seconds
>>> 中医药理论认为,人体的生理功能是相互影响和调节的。因此,对于全身乏力伴心跳过速等症状的治疗,应该从整体上考虑中医理论中的各种元素。
具体来说,针对全身乏力伴心跳过速等症状,可能需要通过调整治疗方案来达到效果。
总的来说,中医药理论可以用来解释并解决全身乏力伴心跳过速等症状。


呃…在 ollama 中重新调用发现只需要 4 秒就完成了输出,但是回答的内容就相当敷衍。vino 方案中输出的结果明显比 ollama 方案数据的结果要来得完整,但是 0.5B 模型输出的效果我觉得 ollama 的输出才算是正常的(毕竟 0.5B 参数少不能要求太高,而 vino 方案输出的感觉更超越上面提到的 14b-chat-q4_K_M 的输出,难道我也出现“幻觉”了?)。

anyway,现在用 vino 方案再换个 1.8B 或者 gamme 2B 应该问题不大了吧。

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐