在Auto DL的租用服务器上跑通ModelScope下载的7B大模型的调用

这次把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`(如果不存在)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alpha xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值