使用MS-SWIF框架对大模型进行SFT微调

MS-SWIFT训练框架
Qwen3最佳实践

GPU资源:Tesla V100S x4(32G x 4)
在这里插入图片描述

底座模型:Qwen3-1.7B
SFT数据集:
alpaca-gpt4-data-en
alpaca-gpt4-data-zh
自我认知微调数据集

训练

export CUDA_VISIBLE_DEVICES=0,1,2,3

swift sft
–model Qwen/Qwen3-1.7B
–train_type lora
–dataset ‘AI-ModelScope/alpaca-gpt4-data-zh#500’
‘AI-ModelScope/alpaca-gpt4-data-en#500’
‘swift/self-cognition#500’
–torch_dtype bfloat16
–num_train_epochs 1
–per_device_train_batch_size 1
–per_device_eval_batch_size 1
–learning_rate 1e-4
–lora_rank 8
–lora_alpha 32
–target_modules all-linear
–gradient_accumulation_steps 16
–eval_steps 50
–save_steps 50
–save_total_limit 2
–logging_steps 5
–max_length 2048
–output_dir output
–system ‘You are a helpful assistant.’
–warmup_ratio 0.05
–dataloader_num_workers 4
–model_author swift
–model_name swift-robot

推理

swift infer
–adapters output/vx-xxx/checkpoint-xxx
–stream true
–temperature 0
–max_new_tokens 2048

swift infer
–adapters /workspace/codes/oss/ms-swift/output/v3-20250905-012245/checkpoint-94
–stream true
–temperature 0
–max_new_tokens 2048

在这里插入图片描述

merge-lora并使用vLLM进行推理加速

swift infer
–adapters output/vx-xxx/checkpoint-xxx
–stream true
–merge_lora true
–infer_backend vllm
–max_model_len 8192
–temperature 0
–max_new_tokens 2048

swift infer
–adapters /workspace/codes/oss/ms-swift/output/v3-20250905-012245/checkpoint-94
–stream true
–merge_lora true
–infer_backend vllm
–max_model_len 8192
–temperature 0
–max_new_tokens 2048

报错:ValueError: Bfloat16 is only supported on GPUs with compute capability of at least 8.0. Your Tesla V100S-PCIE-32GB GPU has compute capability 7.0. You can use float16 instead by explicitly setting the dtype flag in CLI, for example: --dtype=half.
原因:用 Bfloat16(Brain Floating Point 16) 数据类型来节省显存、加速训练,需要GPU 计算能力 ≥ 8.0

使用SGlang推理

SGLANG_USE_MODELSCOPE=true python -m sglang.launch_server --model-path /workspace/codes/oss/ms-swift/output/v3-20250905-012245/checkpoint-94-merged --reasoning-parser qwen3

报错:RuntimeError: SGLang only supports sm75 and above.
原因:SGLang 只支持计算能力(Compute Capability)为 sm_75 及以上的 GPU,你的 GPU 的计算能力低于 sm_75,因此无法运行

模型发布

swift export
–adapters /workspace/codes/oss/ms-swift/output/v3-20250905-012245/checkpoint-94
–push_to_hub true
–hub_model_id ‘lzhawesome/my-lora-model-Qwen3-1.7B’
–hub_token ‘xxxxx’
–use_hf false

<think>好的,我需要帮助用户了解在Swift中如何使用`replacingCharacters`方法。首先,我应该回忆一下这个方法的基本用法。根据用户提供的引用内容,特别是引用[1]和[2],这个方法用于替换字符串中的某个范围的字符。 首先,确定方法的结构。引用[1]提到的方法签名是`func replacingCharacters(in range: NSRange, with replacement: String) -> String`,这说明需要提供一个NSRange和替换的字符串。不过Swift原生的字符串使用Range<String.Index>而不是NSRange,所以可能需要转换。 接下来,用户提供的引用[2]和[3]提到了旧版本Swift中使用`stringByReplacingCharactersInRange`方法,但现在已废弃,改用`replacingCharacters`。同时,Swift 3.0之后,处理字符串索引的方式有所变化,需要使用`String.Index`类型来构建范围。 然后,用户可能遇到的问题是如何正确构建Range。例如,确定起始位置和长度,然后转换为String.Index。引用[4]中的例子展示了如何通过`index`方法来计算偏移量,这可以用来构建正确的范围。 需要注意的是,NSRange和Swift的Range不兼容,所以如果用户有NSRange(比如来自UIKit组件),需要转换。这可能涉及到使用`utf16`偏移量来确保正确,如引用[2]中的例子。 总结步骤应该是:1)创建正确的范围(String.Index或转换NSRange);2)调用`replacingCharacters`方法。同时,提醒用户注意字符串的不可变性,方法会返回新字符串而不是修改原字符串。 最后,检查是否有常见错误,比如索引越界或错误的范围构造,并给出示例代码帮助用户理解。确保引用正确的资料,比如引用[1]和[2]中的方法变更。</think>在 Swift 中使用 `replacingCharacters` 方法需要明确字符串索引和范围的操作,具体步骤如下: --- ### 1. **方法基本用法** `replacingCharacters(in:with:)` 用于替换字符串中指定范围的字符,语法为: ```swift func replacingCharacters(in range: Range<String.Index>, with replacement: String) -> String ``` - **参数说明**: - `in range`:要替换的字符范围(需使用 `String.Index` 类型) - `with replacement`:替换后的新字符串 - **返回值**:替换后的新字符串(原字符串未被修改) --- ### 2. **构建字符串范围** Swift 字符串的索引需要从 `startIndex` 或 `endIndex` 开始计算偏移量: ```swift let originalString = "ABCDEFG" // 示例:替换第2到第4个字符(索引从0开始) let startIndex = originalString.index(originalString.startIndex, offsetBy: 1) // 第2个字符的索引 let endIndex = originalString.index(originalString.startIndex, offsetBy: 4) // 第5个字符的索引(不包含) let range = startIndex..<endIndex // 范围:1≤索引<4(即字符B、C、D) let newString = originalString.replacingCharacters(in: range, with: "XYZ") print(newString) // 输出 "AXYZEFG" [^1][^2] ``` --- ### 3. **处理 NSRange 的情况** 如果已有 `NSRange`(如来自 UIKit 控件),需转换为 `Range<String.Index>`: ```swift import Foundation let nsRange = NSRange(location: 1, length: 3) // 起始位置1,长度3(对应索引1-3) guard let swiftRange = Range(nsRange, in: originalString) else { return } let newString = originalString.replacingCharacters(in: swiftRange, with: "XYZ") print(newString) // 输出 "AXYZFG" [^3] ``` --- ### 4. **注意事项** - **不可变性**:字符串是值类型,方法返回新字符串,原字符串不变。 - **索引越界**:需确保范围在字符串长度内,否则触发运行时错误。 - **多语言支持**:使用 `offsetBy` 时需注意表情符号或组合字符可能影响索引计算[^4]。 --- ### 示例代码 ```swift let text = "Hello,World" let start = text.index(text.startIndex, offsetBy: 7) let end = text.index(text.startIndex, offsetBy: 12) let range = start..<end let result = text.replacingCharacters(in: range, with: "Swift") print(result) // 输出 "Hello,Swift" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值