如何在windows 环境、且没有显卡的情况下用python跑通从ModelScope下载的大模型的调用
文章目录
- 背景介绍
- 源代码:
- 安装调试过程
- 1.设置第三方镜像源
- 2.预先安装:
- 3.在python中创建代码:
- 4.最终修改程序,将device_map从“cuda”改成“auto”,大模型调用1.5B(1___5B)的
- 5.最终跑出结果
- 解释:
- 示例:
- 总结
背景介绍
在上AI训练营的课程时,老师提供了一段源码,目的是实现从modelscope下载DeepSeek-R1-Distill-Qwen-7B,并通过程序调用大模型,让大模型帮助生成二分查找法。
老师建议在网上租一台有GPU的电脑,推荐如下。

最终本人在自己的surface电脑上(Windows,无GPU)调通了该程序,并实现了功能。
我的电脑配置如下,

源代码:
#!/usr/bin/env python
# coding: utf-8# In[1]:from modelscope import AutoModelForCausalLM, AutoTokenizer
# model_name = "/root/autodl-tmp/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"
# model_name="C:\\Users\\Administrator\\AInewModels\\deepseek-ai\\DeepSeek-R1-Distill-Qwen-7B" #7B下载后跑不起来,所以改成1.5B
model_name="C:\\Users\\Administrator\\AInewModels\\deepseek-ai\\DeepSeek-R1-Distill-Qwen-1___5B"
model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",# device_map="cuda" # auto(老师的源程序中是cuda,但是我的电脑没有显卡,因此改成auto)device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "帮我写一个二分查找法"
messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(**model_inputs,max_new_tokens=2000
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
安装调试过程
1.设置第三方镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
2.预先安装:
(在不断出错中不断安装缺少的组件)
pip install modelscope
pip install setuptools
pip install transformers
安装torch
# CPU版本
pip install torch torchvision torchaudio# GPU版本(需匹配CUDA版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install ‘accelerate>=0.26.0’
3.在python中创建代码:
from modelscope import snapshot_download
snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B',cache_dir="C:\\Users\\Administrator\\AInewModels")
运行它,模型下载到C:\Users\Administrator\AInewModels"

有一个warning
2025-04-04 13:39:40,696 - modelscope - WARNING - Failed to create symbolic link C:\Users\Administrator\AInewModels\deepseek-ai\DeepSeek-R1-Distill-Qwen-1.5B for C:\Users\Administrator\AInewModels\deepseek-ai\DeepSeek-R1-Distill-Qwen-1___5B.
中间有过报错,和CUDA有关。
AssertionError: Torch not compiled with CUDA enabled
4.最终修改程序,将device_map从“cuda”改成“auto”,大模型调用1.5B(1___5B)的
model_name="C:\\Users\\Administrator\\AInewModels\\deepseek-ai\\DeepSeek-R1-Distill-Qwen-1___5B"
model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",# device_map="cuda" # autodevice_map="auto" # auto
)
5.最终跑出结果
D:\PycharmProjects\PythonProject\AI0331.venv\Scripts\python.exe D:\PycharmProjects\PythonProject\AI0331\lecture02\3-deepseek-r1-7b使用.py
Sliding Window Attention is enabled but not implemented for sdpa; unexpected results may be encountered.
Setting pad_token_id to eos_token_id:151643 for open-end generation.
好,我现在需要帮用户写一个二分查找法。首先,我得理解用户的需求。用户可能是一个刚开始学习编程的学生,或者对算法感兴趣的人。他们可能需要一个简明的示例来理解二分查找法的实现。
二分查找法的时间复杂度是O(log n),适用于有序数组。所以,我应该包括一个示例代码,帮助用户直观地看到如何实现它。用户可能还希望了解代码的结构和各个部分的作用,比如low、high、mid的计算,以及循环的条件。
接下来,我需要考虑代码的结构。通常,二分查找法的代码会初始化low和high,然后在循环中不断调整mid的值,直到找到目标值或者确定不在数组中。同时,还需要处理找到和未找到的情况,返回相应的索引。
我应该使用清晰的变量名,比如low和high,分别表示数组的起始索引和结束索引。mid的计算方式应该是(low + high)//2,这样可以避免溢出。然后,比较target和arr[mid],如果相等,就返回mid;如果arr[mid]小于target,那么目标值在mid的右边,所以low更新为mid+1;否则,high更新为mid-1。循环的条件是low <= high。
此外,我还需要处理无法找到的情况,比如low > high,这时候返回-1。这样用户就能全面了解二分查找法的实现细节。
最后,我应该测试一下这个代码是否正确。比如,用一个简单的例子,比如数组[1,3,5,7,9],查找5,应该返回2。如果查找10,应该返回-1。这样用户可以验证代码是否正确。
总的来说,我需要写出一个完整的示例代码,解释各个部分的功能,并通过示例验证代码的正确性。这样用户不仅能理解算法,还能通过实际例子加深理解。
以下是一个简单的实现二分查找法的代码示例:
def binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1
解释:
-
参数:
arr:需要查找的有序数组。target:需要查找的目标值。
-
初始化:
low初始值为数组的索引 0。high初始值为数组的最后一个索引(len(arr) - 1)。
-
循环条件:
- 当
low <= high时,继续循环查找。
- 当
-
计算中点:
mid计算为(low + high) // 2,避免溢出。
-
比较和调整范围:
- 如果
arr[mid]等于target,返回mid。 - 如果
arr[mid]小于target,则目标值在mid右侧,将low更新为mid + 1。 - 否则,将
high更新为mid - 1。
- 如果
-
结束条件:
- 当
low > high时,说明目标值不在数组中,返回-1。
- 当
示例:
arr = [1, 3, 5, 7, 9]
target = 7print(binary_search(arr, target)) # 输出:3
这个函数会返回数组中 7 的索引 3。如果 target 不在数组中,函数会返回 -1。
Process finished with exit code 0
总结
由于本人用的surface 没有GPU卡,CPU 也不强劲,内存也不大。因此为了尝试调用本地的大模型模拟deepseek和人的对话和分析,只能调整程序,使用DeepSeek-R1-Distill-Qwen-1___5B 并将device_map从“cuda”改成=“auto”。
相关文章:
如何在windows 环境、且没有显卡的情况下用python跑通从ModelScope下载的大模型的调用
文章目录 背景介绍源代码:安装调试过程1.设置第三方镜像源2.预先安装:3.在python中创建代码:4.最终修改程序,将device_map从“cuda”改成“auto”,大模型调用1.5B(1___5B)的5.最终跑出结果解释:示例&#x…...
黑马点评redis改 part 1
本篇将主要阐述短信登录的相关知识,感谢黑马程序员开源,感谢提供初始源文件(给到的是实战第7集开始的代码)【Redis实战篇】黑马点评学习笔记(16万字超详细、Redis实战项目学习必看、欢迎点赞⭐收藏)-CSDN博…...
Apache Struts2 漏洞(CVE-2017-5638)技术分析
一、漏洞简介 CVE-2017-5638 是 Apache Struts2 中的一个远程命令执行漏洞,攻击者可以通过构造特定的 HTTP 请求头,利用Struts的 OGNL 表达式解析机制,在服务器端执行任意代码。 二、漏洞触发场景 漏洞存在于 Struts2 的 Jakarta Multipar…...
A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议
A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议,主要用于高质量音频流的无线传输。以下是A2DP协议的详细信息: 定义 A2DP协议允许音源设备(Source,简称SRC&#…...
【Ragflow】11. 文件解析流程分析/批量解析实现
概述 本文继续对ragflow文档解析部分进行分析,并通过脚本的方式实现对文件的批量上传解析。 文件解析流程 文件解析的请求处理流程大致如下: 1.前端上传文件,通过v1/document/run接口,发起文件解析请求 2.后端api\apps\docum…...
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
✨前言:传参和状态管理,看似简单其实门道不少 在 Web 开发中,前端和后端最核心的交流方式就是“传参”,而“传参”除了涉及如何写代码获取参数,还藏着很多开发者容易忽略的细节: 为什么 URL 带了中文&…...
嵌入式学习笔记——ARM-中断与异常
文章目录 中断与异常的区别中断与 DMA 的区别中断能否睡眠?下半部能否睡眠?1. 中断处理程序不能睡眠2. 下半部(SoftIRQ、Tasklet、Workqueue) 中断处理注意点1. 快进快出2. 避免阻塞3. 正确返回值4. 如何处理大量任务5. 避免竞态问…...
Everything 安装教程与使用教程(附安装包)
文章目录 前言一、Everything 介绍二、Everything 安装教程1.Everything 安装包下载2.选择安装文件3.选择安装语言4.接受许可协议5.选择安装位置6.配置安装选项7.完成安装 三、Everything 使用教程1.启动软件2.简单关键词搜索3.按类型搜索 前言 在日常使用电脑时,随…...
嵌入式开发中栈溢出的处理方法
嵌入式开发中栈溢出的处理方法 目录 引言栈溢出的原理栈溢出的危害栈溢出检测方法 哨兵变量法栈着色法硬件监测机制编译器栈保护 裸机系统中的栈溢出处理操作系统中的栈溢出处理预防栈溢出的最佳实践结论 引言 在嵌入式系统开发中,栈溢出是一个常见且危险的问题…...
SQL语句(三)—— DQL
目录 基本语法 一、基础查询 1、查询多个字段 2、字段设置别名 3、去除重复记录 4、示例代码 二、条件查询 1、语法 2、条件列表常用的运算符 3、示例代码 三、分组查询 (一)聚合函数 1、介绍 2、常见的聚合函数 3、语法 4、示例代码 &…...
#python项目生成exe相关了解
在 Windows 上将 Python 项目 生成 EXE 可执行文件,主要使用 pyinstaller。以下是完整步骤: 📌 1. 安装 PyInstaller pip install pyinstaller如果已安装,可执行以下命令检查版本: pyinstaller --versionὌ…...
Opencv计算机视觉编程攻略-第九节 描述和匹配兴趣点
一般而言,如果一个物体在一幅图像中被检测到关键点,那么同一个物体在其他图像中也会检测到同一个关键点。图像匹配是关键点的常用功能之一,它的作用包括关联同一场景的两幅图像、检测图像中事物的发生地点等等。 1.局部模板匹配 凭单个像素就…...
JSON-lib考古现场:在2025年打开赛博古董店的奇妙冒险
各位在代码海洋里捡贝壳的探险家们!今天我们要打开一个尘封的Java古董箱——JSON-lib!这货可是2003年的老宝贝,比在座很多程序员的工龄还大!准备好穿越回Web 1.0时代,感受XML统治时期的余晖了吗? …...
Android: Handler 的用法详解
Android 中 Handler 的用法详解 Handler 是 Android 中用于线程间通信的重要机制,主要用于在不同线程之间发送和处理消息。以下是 Handler 的全面用法指南: 一、Handler 的基本原理 Handler 基于消息队列(MessageQueue)和循环器(Looper)工作,…...
汇编学习之《push , pop指令》
学习本章前线了解ESP, EBP 指令 汇编学习之《指针寄存器&大小端学习》-CSDN博客 栈的特点: 好比一个垂直容器,可以陆续放入物体,但是先放的物体通常会被后面放的物体压着,只有等上面后放的物品拿出来后,才能…...
Python循环控制语句
1. 循环类型概述 Python提供两种主要的循环结构: while循环 - 在条件为真时重复执行for循环 - 遍历序列中的元素 2. while循环 基本语法 while 条件表达式:循环体代码示例 count 0 while count < 5:print(f"这是第{count1}次循环")count 13. f…...
微信小程序(下)
目录 在事件处理函数中为 data 中的数据赋值 事件传参 bindinput 的语法格式 实现文本框和 data 之间的数据同步 条件渲染 结合 使用 wx:if hidden wx:if与 hidden 的对比 wx:for 手动指定索引和当前项的变量名 wx:key 的使用 WXSS 和 CSS 的关系 什么是 rpx 尺寸…...
【零基础入门unity游戏开发——2D篇】2D 游戏场景地形编辑器——TileMap的使用介绍
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
vector的介绍与代码演示
由于以后我们写OJ题时会经常使用到vector,所以我们必不可缺的是熟悉它的各个接口。来为我们未来作铺垫。 首先,我们了解一下: https://cplusplus.com/reference/vector/ vector的概念: 1. vector是表示可变大小数组的序列容器…...
ubuntu 22.04 解决LXC 报错CGroupV1 host system
解决CGroupV1 host system 报错 echo "cgroupv1 environment" sed -i s/^GRUB_CMDLINE_LINUX.*/GRUB_CMDLINE_LINUX_DEFAULT"quiet splash systemd.unified_cgroup_hierarchy0" / /etc/default/grub update-grub reboot 下载oracle 7 Linux 容器测试 l…...
JavaEE初阶复习(JVM篇)
JVM Java虚拟机 jdk java开发工具包 jre java运行时环境 jvm java虚拟机(解释执行 java 字节码) java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件>.class文件(字节码文件) 字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为…...
MINIQMT学习课程Day9
获取qmt账号的持仓情况后,我们进入下一步,如何获得当前账号的委托状况 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件 导入包: from xtquant import xtdata from xtqua…...
动态规划似包非包系列一>组合总和IIV
目录 题目分析:状态表示:状态转移方程:初始化填表顺序返回值:代码呈现: 题目分析: 状态表示: 状态转移方程: 初始化填表顺序返回值: 代码呈现: class Soluti…...
Java 二叉树非递归遍历核心实现
非递归遍历的核心是用栈模拟递归的调用过程,通过手动维护栈来替代系统栈,实现前序、中序和后序遍历。以下是三种遍历的代码实现与关键逻辑分析: 一、二叉树遍历 1.1、前序遍历(根 → 左 → 右) 核心逻辑:…...
JavaScript性能优化实践:从微观加速到系统级策略
JavaScript性能优化实践:从微观加速到系统级策略 引言:性能优化的"时空折叠"思维 在JavaScript的世界里,性能优化如同在时间与空间的维度中折叠代码。本文将通过"时空折叠"的隐喻,从代码执行效率(时间维度)和内存占用(空间维度)两大核心,结合现代…...
《P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题》
题目描述 输入两个正整数 x0,y0,求出满足下列条件的 P,Q 的个数: P,Q 是正整数。 要求 P,Q 以 x0 为最大公约数,以 y0 为最小公倍数。 试求:满足条件的所有可能的 P,Q 的个数。 输入格式 一行两个正整数 x0,y0。…...
【力扣hot100题】(052)课程表
什么人一学期要上2000节课啊jpg 看了非常久都没思路,主要是数据结构还没复习到图论,根本没思路怎么储存一个图…… 唯一记得的就是两种存储方法,一种是二维数组法,记录每一条边的有无,一种是只记录有的边,…...
SpringBoot配置文件多环境开发
目录 一、设置临时属性的几种方法 1.启动jar包时,设置临时属性 2.idea配置临时属性 3.启动类中创建数组指定临时属性 二、多环境开发 1.包含模式 2.分组模式 三、配置文件的优先级 1.bootstrap 文件优先: 2.特定配置文件优先 3.文件夹位置优…...
RSA和ECC在密钥长度相同的情况下哪个更安全?
现在常见的SSL证书,如:iTrustSSL都支持RSA和ECC的加密算法,正常情况下RAS和ECC算法该如何选择呢?实际上在密钥长度相同的情况下,ECC(椭圆曲线密码学)通常比RSA(Rivest-Shamir-Adle…...
Dive into Deep Learning - 2.4. Calculus (微积分)
Dive into Deep Learning - 2.4. Calculus {微积分} 1. Derivatives and Differentiation (导数和微分)1.1. Visualization Utilities 2. Chain Rule (链式法则)3. DiscussionReferences 2.4. Calculus https://d2l.ai/chapter_preliminaries/calculus.html For a long time, …...
