山东大学项目实训团队周报(五)

目录

一、任务概述

二、完成情况

2.1 前端

2.1.1 主页

2.1.2 对话 

2.1.3 地图

2.2 后端——模型调参

2.2.1 分析模型参数,确定可调整的参数。

2.2.2 调参记录

2.2.3 调参结果

2.3 前后端交互


一、任务概述

        这周我们的任务主要分为三部分:前端页面的代码编写 、 后端模型调试 和 前后端交互。

        其中前端我们接续上周的工作,继续编写和完善前端代码。

        后端部分则继续进行模型的微调,我们将继续使用我们自己的数据集对模型进行微调。

        前后端交互我们则编写接口,并修改前后端代码进行交互尝试。

二、完成情况

2.1 前端

2.1.1 主页

        说明一下有关天气页面.js文件的配置

        数据项的配置。该页面的配置需要以上数据,包括地区、时间、天气数据、气候数据、穿衣与防护的建议等等。

        从第三方API获取相关数据的函数配置。我将这一函数设置为get_weather(){},我们首先获取地理位置,定位到当前的经纬度,在根据经纬度,获取当前所在的市区信息,如下图所示,这里的key换为先前自己所获取到的即可。

        在这个过程中,使用到了wx.getLocation函数获取经纬度,并通过wx.request向和风天气的url:url:`https://geoapi.qweather.com/v2/city/lookup?location=${longitude},${latitude}&key=${key}`,发出请求以获取地理信息。注意:想要getlocation等函数正常运行,需要首先在全局配置文件app.json中设置"permission"与“requiredPrivateInfos”属性,如下图所示。

        接受好地理信息以后我们继续使用wx.request向API请求天气数据与气候指数数据,分别使用到的url为以下两条:

`https://devapi.qweather.com/v7/weather/nowlocation=${longitude},${latitude}&key=${key}’

 ‘https://devapi.qweather.com/v7/indices/1dtype=1,2,3,4,5&location=${longitude},${latitude}&key=${key}’

        有关获取穿衣与防晒建议的补充。 通过console.log输出所获取到的气候指数可以看到API为我们提供5种指数,点开具体项即可看到在text属性中保存着我们想要的对这一气候指数的具体建议。这里我只用到了穿衣指数和紫外线指数的建议,因此只需要接受第三条和第五条的text即可。

        至此,我们就完成了这一页面的所有书写,具体效果如下图所示。

2.1.2 对话 

        调用语音进行录音并上传到微信服务器进行语音识别这一部分非常麻烦,首先需要完整注册一个微信小程序,并且申请语音识别模块,网上有很多教程,不过多赘述。

        我们需要编写多个函数,用以判断对语音组件的长按的开始和长按的结束,并在这中间进行录音,然后将录制的音频文件上传到微信服务器进行语音识别,将得到的语音识别字符串添加“flag”字段加入到dialogue数据中,并更新对话框。

  <view bindtouchstart="startLongPress" bindtouchmove="cancelLongPress" bindtouchend="endLongPress" class="voice">
    <image class="voice-image" src="/images/dialogue/voice.png"></image>
  </view>
  startLongPress(e) {  
    console.log("start")
    if (this.data.isRecording) return; // 如果已经在录音,则不处理  
    this.setData({  
      isRecording: true,  
    });  
    this.longPressTimer = setTimeout(() => {  
      this.startRecord(); // 开始录音  
    }, 500); // 假设500毫秒后开始录音  
  },  
  // 取消长按(移动手指)  
  cancelLongPress(e) {  
    console.log("end")
    clearTimeout(this.longPressTimer);  
    this.setData({  
      isRecording: false,  
    });  
  },  
  // 结束长按  
  endLongPress(e) {  
    clearTimeout(this.longPressTimer);  
    if (!this.data.isRecording) return;  
    this.stopRecord(); // 停止录音并识别语音  
  },  
  // 开始录音  
  startRecord() {  
    console.log("start_record")
    const recorderManager = wx.getRecorderManager();  
    recorderManager.start({  
      success: res => {  
        console.log('开始录音');  
      },  
      fail: err => {  
        console.error('录音失败:', err);  
      }  
    });  
    recorderManager.onStop(this.recognizeVoice); // 监听录音结束事件  
  },  
  // 停止录音并识别语音  
  stopRecord() {  
    console.log("end_record")
    const recorderManager = wx.getRecorderManager();  
    recorderManager.stop();  
  },  
  // 识别语音  
  recognizeVoice(res) {  
    if (res.tempFilePath) {  
      // 这里使用微信小程序的语音识别API,注意需要用户授权  
      wx.translateVoice({
        localId: res.localId, 
        isShowProgressTips: 1, 
        success(res) {
          console.log('语音识别的结果'+res.translateResult);
          this.data.dialogue.push({"flag": 1, "content": res.translateResult})
          this.setData({
            dailogue: this.data.dialogue
          })
        },
        fail(err){
          console.log('识别失败',err)
        }
      })
    }  
  },  
2.1.3 地图

        尝试实现目前位置与景点位置的距离计算,并在上图红框位置更改。

        大体的思路就是我们在弹窗弹出时要计算目前位置与选中景点的距离并更改。于是关键问题就在距离计算,这需要用到腾讯位置服务。

        阅读距离矩阵计算文档,按要求对给出的URL发送请求,注意,key依然是在腾讯位置服务中注册的key,主要代码如下:

getDistance(){
      var _this = this
      wx.request({
        url: 'https://apis.map.qq.com/ws/distance/v1/matrix?mode=walking', 
        data: {
          "key":"EBZ-OK5OGYBEN-O-TAFFF",
          "from":this.data.defaultLatitude+","+this.data.defaultLongitude,
          "to":this.data.popup.latitude+","+this.data.popup.longitude
        },
        header: {
          'content-type': 'application/json' 
        },
        success (res) {
          _this.setData({
            "popup.dis":res.data.result.rows[0].elements[0].distance,
            "popup.popupShow":true,
          })
        }
      })
      
  },

2.2 后端——模型调参

2.2.1 分析模型参数,确定可调整的参数。

        在微调脚本中,有多处参数可以调整以优化训练过程和模型性能。以下是各个参数的详细说明及其可能的调整方向:
可调参数

    NUM_WORKERS 和 NUM_GPUS_PER_WORKER:
        NUM_WORKERS: 训练使用的工作节点数。默认设置为1,可以根据可用资源增加以进行多节点训练。
        NUM_GPUS_PER_WORKER: 每个节点的GPU数量。根据实际硬件配置调整。

    MP_SIZE:
    模型并行大小。默认设置为1,可以在大模型训练时增加以分布计算负载。

    MODEL_ARGS:
        --max_source_length: 最大输入长度。根据任务需求调整,例如增加以处理更长的输入。
        --max_target_length: 最大输出长度。根据任务需求调整,例如增加以生成更长的输出。
        --lora_rank: LoRA的秩。增加或减少该值以控制微调的灵活性和计算量。
        --layer_range: 选择进行LoRA微调的层范围。调整以选择不同的层进行微调。
        --pre_seq_len: 前缀序列长度。根据任务需要调整以影响模型的上下文理解能力。

    NCCL 配置:
        NCCL_DEBUG: NCCL的调试信息级别,可以设置为info、warn、error等。
        NCCL_IB_DISABLE: 是否禁用NCCL的IB。设置为0表示启用,1表示禁用。
        NCCL_NET_GDR_LEVEL: GDR级别。根据硬件配置和性能需求调整。

    训练和验证数据路径:
    train_data 和 eval_data: 训练和验证数据的路径。确保路径正确并包含合适的数据格式。

    GPT 训练选项:
        --train-iters: 训练迭代次数。根据数据量和任务复杂度调整。
        --lr-decay-style: 学习率衰减样式。可选择cosine、linear等。
        --warmup: 预热比例。调整以控制学习率预热阶段的长度。
        --save-interval: 保存间隔。根据训练时间和需要调整保存频率。
        --eval-interval: 评估间隔。根据需要调整评估频率。
        --split: 数据拆分比例。根据数据集情况调整。
        --eval-iters: 评估迭代次数。调整以控制评估数据量。
        --eval-batch-size: 评估批次大小。根据显存大小和评估速度调整。
        --zero-stage: ZeRO优化阶段。调整以控制显存优化策略。
        --lr: 学习率。根据任务和模型收敛速度调整。
        --batch-size: 训练批次大小。根据显存大小和数据量调整。
        --use_lora: 是否启用LoRA微调。根据需要启用或禁用。

2.2.2 调参记录

        增加迭代次数和评估频率

        训练迭代次数和评估频率是控制训练过程和模型评估的关键参数。调整这些参数可以提高模型的最终性能和评估的频率。训练迭代次数(--train-iters)默认值为500,可以将其增加到1000以提高模型的训练时间和最终性能。增加训练迭代次数可以让模型有更多机会学习数据,但会增加训练时间。

        评估频率(--eval-interval):默认值为10000,可以将其调整为500以增加评估的频率。增加评估频率可以更频繁地监控模型的性能变化,及时发现训练中的问题。

--train-iters 500 \
--eval-interval 300 \

        修改微调层范围和LoRA秩

        微调层范围和LoRA秩是控制微调灵活性和计算复杂度的关键参数。调整这些参数可以影响模型的微调效果和计算资源需求。微调层默认层范围可能是0和14,可以将其扩展为更多的层,以提高微调的灵活性和细致程度。

        默认秩为10,可以将其调整为8以减少计算复杂度和显存占用。较低的LoRA秩可以减少训练时间和资源需求,但可能会影响模型性能。

--layer_range 0 2 4 6 8 10 12 14 \
--lora_rank 8 \

        调整批次大小和学习率

        批次大小和学习率是影响模型训练过程和性能的关键参数。调整这些参数可以显著改善模型的收敛速度和最终性能。较大的批次大小可以提高训练的稳定性,减少噪声,但需要更多的显存。
学习率默认值为0.0001,可以将其调整为0.00005以使模型训练更稳定。较小的学习率可以减少训练过程中的波动,有助于模型更好地收敛,但可能需要更多的训练迭代。

--batch-size 16 \
--lr 0.00005 \

        将以上所有调整策略综合应用到微调脚本中,可以如下进行配置:

#! /bin/bash
 
NUM_WORKERS=1
NUM_GPUS_PER_WORKER=8
MP_SIZE=1
 
script_path=$(realpath $0)
script_dir=$(dirname $script_path)
main_dir=$(dirname $script_dir)
MODEL_TYPE="visualglm-6b"
MODEL_ARGS="--max_source_length 64 \
    --max_target_length 256 \
    --lora_rank 8 \
    --layer_range 0 2 4 6 8 10 12 14 \
    --pre_seq_len 4"
 
OPTIONS_NCCL="NCCL_DEBUG=info NCCL_IB_DISABLE=0 NCCL_NET_GDR_LEVEL=2"
HOST_FILE_PATH="hostfile"
HOST_FILE_PATH="hostfile_single"
 
train_data="./own_data/output.json"
eval_data="./own_data/output.json"
 
gpt_options=" \
       --experiment-name finetune-$MODEL_TYPE \
       --model-parallel-size ${MP_SIZE} \
       --mode finetune \
       --train-iters 1000 \
       --resume-dataloader \
       $MODEL_ARGS \
       --train-data ${train_data} \
       --valid-data ${eval_data} \
       --distributed-backend nccl \
       --lr-decay-style cosine \
       --warmup .02 \
       --checkpoint-activations \
       --save-interval 100 \
       --eval-interval 500 \
       --save './checkpoints' \
       --split 1 \
       --eval-iters 10 \
       --eval-batch-size 8 \
       --zero-stage 1 \
       --lr 0.00005 \
       --batch-size 16 \
       --skip-init \
       --fp16 \
       --use_lora
"
 
run_cmd="${OPTIONS_NCCL} deepspeed --master_port 16666 --hostfile ${HOST_FILE_PATH} finetune_visualglm.py ${gpt_options}"
echo ${run_cmd}
eval ${run_cmd}
 
set +x
2.2.3 调参结果

        将上述参数进行控制变量法调试,进行模型微调和推理,通过对比同张图片的回答来评估模型的效果。对于同张图片,
        微调前的回答:

        微调后的回答:

        我们数据集的普遍labels:

        可以看到,通过更改模型参数,微调后的模型回答的模式更接近数据集的labels,但是它仍缺乏景点识别的准确性,无法正确识别图像中的文字。这一缺陷是由于模型本身的局限性,官方也指出了VisualGLM 6B目前处于v1阶段,图像描述事实性/模型幻觉问题,图像细节信息捕捉不足,以及一些来自语言模型的局限性。尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于 VisualGLM-6B 模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确性,且模型易被误导。

2.3 前后端交互

        未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值