这次把AI培训实验中如何在Auto DL的租用服务器上跑通ModelScope下载的7B大模型的调用的过程记录一下。
1.申请资源并开机
-
网址:https://autodl.com/home
-
注册
-
绑定微信
-
充值
-
进入算力市场,选择服务器租用,选择基础镜像,pytorch的版本如下
-
点击创建开机
-
此时用系统提供的链接名和密码可用xterm远程登录到云服务器(本次实验不必)
2.使用jupyter配置运行环境
-
点击右边快捷工具中的jupyter,启动jupyter
-
上载主程序到autodl-tmp目录。
注意完成下一步下载大模型后,重新修改一下源码的model_name的路径(直接在jupyter里拷贝大模型路径)
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name="/root/autodl-tmp/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"
#model_name = "/root/autodl-tmp/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="cuda" # 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)
-
配置国内镜像源
!pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
-
安装modelscope
!pip install modelscope
-
下载大模型(注意cache_dir的设置,因为Auto DL给你的数据盘在/root/autodl-tmp下,不要下载到系统盘)
from modelscope import snapshot_download
snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-7B', cache_dir="/root/autodl-tmp/models")
- 下载transformer
!pip install transformers
3.运行主程序
运行结果
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
Loading checkpoint shards: 100%
2/2 [00:04<00:00, 2.07s/it]
Setting `pad_token_id` to `eos_token_id`:151643 for open-end generation.
嗯,用户让我帮他写一个二分查找法。好的,首先我得想一下二分查找的基本概念。二分查找,也叫折半查找,是一种高效的查找方法,适用于有序数组。它的基本思想是将数组分成左右两部分,每次比较中间元素,根据比较结果决定下一步查找的区域,从而快速缩小查找范围。
那用户可能需要的是代码实现,可能是在编程学习或者项目中需要用到。我得考虑用户使用的编程语言,但用户没说,可能需要写一个通用的版本,或者用常见的语言比如Python或者Java。假设用户可能更倾向于Python,因为它语法简单,容易实现。
接下来,我需要确定二分查找的结构。通常,二分查找的实现需要确定左边界left和右边界right,然后循环直到left不超过right。每次计算中间位置mid,比较数组[mid]和目标值target。如果数组[mid]等于target,返回mid;如果数组[mid]小于target,那么需要在右半部分继续搜索;如果数组[mid]大于target,就在左半部分继续。
我还需要考虑边界条件,比如数组为空的情况,或者目标值不在数组中。这时候函数应该返回-1或者抛出错误。用户可能需要处理这两种情况,所以代码中要包含相应的判断。
举个例子,假设数组是已排序的,比如[1,3,5,7,9],查找3。左边界是0,右边界是4。中间是2,数组[2]是5,比3大,所以右边界变成1。下一次循环,left=0,right=1,中间是0,数组[0]是1,比3小,所以左边界变成1。此时left等于right=1,数组[1]=3,等于目标值,返回1。
那代码的结构大概是这样的:
1. 初始化left=0,right=len(arr)-1。
2. 循环条件是left <= right。
3. 计算mid = (left + right) // 2。
4. 比较arr[mid]和target:
- 相等:返回mid。
- 小于:left = mid +1。
- 大于:right = mid -1。
5. 循环结束后,如果没找到,返回-1。
另外,我需要提醒用户,数组必须是有序的,否则二分查找无法正确工作。可能用户没有意识到这一点,所以代码中应该包含一个说明,确保用户知道数组必须是有序的。
还有,如果用户需要,可以提供一个完整的函数,包括参数和返回值的说明。比如,函数返回索引或者-1,说明数组未找到目标值。
最后,考虑到用户可能需要示例,我可以加一句:“例如,当你调用binary_search(arr, target)时,它会返回索引或-1。” 这样用户更容易理解如何使用代码。
总结一下,我应该写一个清晰、简洁的二分查找函数,包含必要的条件判断,说明数组必须有序,并且给出示例说明。这样用户不仅能得到代码,还能理解如何正确使用它。
</think>
当然可以!以下是一个简单的二分查找算法的实现,适用于已排序的数组:
def binary_search(arr, target):
left = 0
right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 目标值不在数组中
### 示例
假设有一个有序数组 `arr = [1, 3, 5, 7, 9]`,我们想查找目标值 `3`:
1. 初始化 `left = 0`,`right = 4`。
2. 循环开始,计算 `mid = (0 + 4) // 2 = 2`。
3. 比较 `arr[2] = 5` 和 `target = 3`:
- `5 > 3`,所以 `right = 2 - 1 = 1`。
4. 下次循环,`left = 0`,`right = 1`,计算 `mid = (0 + 1) // 2 = 0`。
5. 比较 `arr[0] = 1` 和 `target = 3`:
- `1 < 3`,所以 `left = 0 + 1 = 1`。
6. 下次循环,`left = 1`,`right = 1`,计算 `mid = (1 + 1) // 2 = 1`。
7. 比较 `arr[1] = 3` 和 `target = 3`,相等,返回 `1`。
### 注意事项
- 该算法假设数组是有序的(递增顺序)。
- 如果数组中没有重复元素,且目标值不存在,函数返回 `-1`。
- 如果数组中存在重复元素,可能会返回第一个出现的位置。
例如,当你调用 `binary_search(arr, target)` 时,它会返回目标值的索引(如果存在)或 `-1`(如果不存在)。