Browse Source

修改训练代码

zhouyang.xie 4 months ago
parent
commit
8209e1aa94

+ 155 - 1
data/processed/processed_data.txt

@@ -1,3 +1,58 @@
+案例0 叶轮不平衡故障
+1. 现象描述:
+某风电机组为siemens gamesa sg 3.4-132型号,额定功率为3.4 mw,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°c左右,叶根温度稳定在30°c。振动监测系统采集到的数据显示,垂直径向(y轴)振动幅值为1.6 mm/s,水平径向(x轴)振动幅值为0.4 mm/s,轴向(z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 hz,而2倍转速频率(0.6 hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
+2. 诊断过程:
+为了进一步确认叶片是否存在不平衡故障,运用了振动监测系统的时域分析和频谱分析功能。在频谱图中,z轴(轴向)方向的主频峰值出现在0.3 hz,且在0.6 hz(2倍转速频率)处出现了明显的振动增幅,这与叶片不平衡故障的特征一致。同时,振动幅度在y轴方向(垂直径向)出现了异常增高,说明振动的来源可能主要来自于叶轮的不平衡。为了排除齿轮箱和发电机的故障,检查了低速轴、高速轴以及行星轮的振动频率,未发现明显的异常成分,这进一步支持了叶片不平衡的诊断。
+3. 诊断结论:
+根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在z轴(轴向)方向较高,但在x轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
+4. 排查建议:
+为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+
+---
+
+案例1 主轴不对中故障
+1. 现象描述:
+某sg 4.2-148型机组,额定功率4.2mw,齿轮箱为三级传动结构。在10m/s风速下运行时,主轴轴向振动值持续升高。轴向(z轴)振动幅值达2.8mm/s,水平径向(x轴)1.2mm/s,频谱显示2倍转速频率(0.8hz)处出现显著峰值。齿轮箱输入轴温度异常升至68°c,联轴器区域可闻周期性异响。
+
+2. 诊断过程:
+通过相位分析发现x-z轴振动相位差接近180°,振动波形呈现明显"香蕉形"特征。使用激光对中仪检测发现轴向偏差达0.35mm,角向偏差0.2mm/100mm。齿轮箱振动频谱中未发现啮合频率成分,排除齿轮故障可能。
+
+3. 诊断结论:
+主轴系统存在复合型不对中故障,特征包括:1)轴向振动2倍频突出 2)相位差符合不对中特征 3)联轴器温度异常。主要原因为基础沉降导致对中状态劣化。
+
+4. 排查建议:
+1) 执行激光对中校正 2) 检查弹性联轴器磨损情况 3) 加强基础沉降监测 4) 校正后持续监测振动趋势
+
+---
+
+案例2 齿轮箱高速轴磨损故障
+1. 现象描述:
+sg 5.0-170机组在满发状态下,齿轮箱油温异常升至85°c(正常<75°c)。振动监测显示高速轴(输出轴1800rpm)径向振动达7.5mm/s,频谱中啮合频率(450hz)两侧出现边带,间隔频率30hz(对应高速轴转频)。油液检测发现铜元素含量超标(82ppm)。
+
+2. 诊断过程:
+时域波形呈现周期性冲击特征,包络分析显示冲击间隔与高速轴旋转周期一致。使用内窥镜检查发现高速轴轴承滚道存在剥落,齿轮啮合面可见均匀磨损痕迹。行星轮系振动特征正常,排除行星轮故障。
+
+3. 诊断结论:
+高速轴轴承磨损引发齿轮异常啮合,特征包括:1)啮合频率边带现象 2)油液金属颗粒超标 3)温度异常升高。磨损原因与润滑不良有关。
+
+4. 排查建议:
+1) 更换高速轴轴承组件 2) 清洗润滑系统并更换油品 3) 加装在线油液监测 4) 调整齿轮侧隙
+
+---
+
+案例3 齿轮箱断齿故障
+1. 现象描述:
+某sg 6.0-170机组在启停过程中出现剧烈振动,齿轮箱振动值瞬间冲高至12mm/s。频谱分析显示中速级啮合频率(187hz)处出现明显共振峰,伴随转频(3.5hz)边带。声发射检测到高频冲击信号,油滤发现金属碎片。
+
+2. 诊断过程:
+时域信号呈现周期性冲击衰减波形,冲击周期对应断齿齿轮的旋转周期。相位锁定分析确认故障源位于二级平行轴齿轮副。开箱检查发现中速级大齿轮存在3个连续断齿,断口呈现疲劳断裂特征。
+
+3. 诊断结论:
+齿轮箱二级传动齿轮发生断齿故障,特征包括:1)啮合频率共振峰 2)周期性冲击衰减波形 3)金属碎屑产生。根本原因为齿根应力集中导致疲劳断裂。
+
+4. 排查建议:
+1) 更换受损齿轮副 2) 进行齿面渗碳强化处理 3) 优化启停控制逻辑 4) 加装齿轮应力监测系统
+
 风电机组siemens gamesa sg 3.4-132型号叶轮不平衡故障案例
 1. 现象描述:
 某风电机组为siemens gamesa sg 3.4-132型号,额定功率为3.4 mw,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°c左右,叶根温度稳定在30°c。振动监测系统采集到的数据显示,垂直径向(y轴)振动幅值为1.6 mm/s,水平径向(x轴)振动幅值为0.4 mm/s,轴向(z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 hz,而2倍转速频率(0.6 hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
@@ -6,4 +61,103 @@
 3. 诊断结论:
 根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在z轴(轴向)方向较高,但在x轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
 4. 排查建议:
-为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+案例0 叶轮不平衡故障
+1. 现象描述:
+某风电机组为siemens gamesa sg 3.4-132型号,额定功率为3.4 mw,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°c左右,叶根温度稳定在30°c。振动监测系统采集到的数据显示,垂直径向(y轴)振动幅值为1.6 mm/s,水平径向(x轴)振动幅值为0.4 mm/s,轴向(z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 hz,而2倍转速频率(0.6 hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
+2. 诊断过程:
+为了进一步确认叶片是否存在不平衡故障,运用了振动监测系统的时域分析和频谱分析功能。在频谱图中,z轴(轴向)方向的主频峰值出现在0.3 hz,且在0.6 hz(2倍转速频率)处出现了明显的振动增幅,这与叶片不平衡故障的特征一致。同时,振动幅度在y轴方向(垂直径向)出现了异常增高,说明振动的来源可能主要来自于叶轮的不平衡。为了排除齿轮箱和发电机的故障,检查了低速轴、高速轴以及行星轮的振动频率,未发现明显的异常成分,这进一步支持了叶片不平衡的诊断。
+3. 诊断结论:
+根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在z轴(轴向)方向较高,但在x轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
+4. 排查建议:
+为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+
+---
+
+案例1 主轴不对中故障
+1. 现象描述:
+某sg 4.2-148型机组,额定功率4.2mw,齿轮箱为三级传动结构。在10m/s风速下运行时,主轴轴向振动值持续升高。轴向(z轴)振动幅值达2.8mm/s,水平径向(x轴)1.2mm/s,频谱显示2倍转速频率(0.8hz)处出现显著峰值。齿轮箱输入轴温度异常升至68°c,联轴器区域可闻周期性异响。
+
+2. 诊断过程:
+通过相位分析发现x-z轴振动相位差接近180°,振动波形呈现明显"香蕉形"特征。使用激光对中仪检测发现轴向偏差达0.35mm,角向偏差0.2mm/100mm。齿轮箱振动频谱中未发现啮合频率成分,排除齿轮故障可能。
+
+3. 诊断结论:
+主轴系统存在复合型不对中故障,特征包括:1)轴向振动2倍频突出 2)相位差符合不对中特征 3)联轴器温度异常。主要原因为基础沉降导致对中状态劣化。
+
+4. 排查建议:
+1) 执行激光对中校正 2) 检查弹性联轴器磨损情况 3) 加强基础沉降监测 4) 校正后持续监测振动趋势
+
+---
+
+案例2 齿轮箱高速轴磨损故障
+1. 现象描述:
+sg 5.0-170机组在满发状态下,齿轮箱油温异常升至85°c(正常<75°c)。振动监测显示高速轴(输出轴1800rpm)径向振动达7.5mm/s,频谱中啮合频率(450hz)两侧出现边带,间隔频率30hz(对应高速轴转频)。油液检测发现铜元素含量超标(82ppm)。
+
+2. 诊断过程:
+时域波形呈现周期性冲击特征,包络分析显示冲击间隔与高速轴旋转周期一致。使用内窥镜检查发现高速轴轴承滚道存在剥落,齿轮啮合面可见均匀磨损痕迹。行星轮系振动特征正常,排除行星轮故障。
+
+3. 诊断结论:
+高速轴轴承磨损引发齿轮异常啮合,特征包括:1)啮合频率边带现象 2)油液金属颗粒超标 3)温度异常升高。磨损原因与润滑不良有关。
+
+4. 排查建议:
+1) 更换高速轴轴承组件 2) 清洗润滑系统并更换油品 3) 加装在线油液监测 4) 调整齿轮侧隙
+
+---
+
+案例3 齿轮箱断齿故障
+1. 现象描述:
+某sg 6.0-170机组在启停过程中出现剧烈振动,齿轮箱振动值瞬间冲高至12mm/s。频谱分析显示中速级啮合频率(187hz)处出现明显共振峰,伴随转频(3.5hz)边带。声发射检测到高频冲击信号,油滤发现金属碎片。
+
+2. 诊断过程:
+时域信号呈现周期性冲击衰减波形,冲击周期对应断齿齿轮的旋转周期。相位锁定分析确认故障源位于二级平行轴齿轮副。开箱检查发现中速级大齿轮存在3个连续断齿,断口呈现疲劳断裂特征。
+
+3. 诊断结论:
+齿轮箱二级传动齿轮发生断齿故障,特征包括:1)啮合频率共振峰 2)周期性冲击衰减波形 3)金属碎屑产生。根本原因为齿根应力集中导致疲劳断裂。
+
+4. 排查建议:
+1) 更换受损齿轮副 2) 进行齿面渗碳强化处理 3) 优化启停控制逻辑 4) 加装齿轮应力监测系统
+
+---
+
+案例4 发电机高温故障
+1. 现象描述:
+sg 4.5-155机组发电机定子温度持续超过155°c(报警阈值150°c),冷却系统出口风温达65°c。振动监测显示2倍线频(100hz)分量增加,绝缘电阻测试显示b相绕组对地绝缘降至0.8mω。功率输出波动±8%。
+
+2. 诊断过程:
+热成像检测发现定子铁芯局部过热点(温差δt=25°c)。绕组直流电阻测试显示三相不平衡度达7%。局放检测发现典型槽放电信号,频率成分集中在3-15mhz范围。
+
+3. 诊断结论:
+发电机定子绕组绝缘劣化导致高温故障,特征包括:1)局部过热点 2)绝缘电阻下降 3)放电信号。原因系长期运行导致的绝缘老化。
+
+4. 排查建议:
+1) 更换受损绕组 2) 清洗冷却风道 3) 加装光纤测温系统 4) 开展定期绝缘老化试验
+
+---
+
+案例5 变桨系统故障
+1. 现象描述:
+sg 3.6-140机组在风速变化时出现功率振荡,变桨角度响应延迟达6秒(正常<2秒)。液压系统压力波动范围±12bar,变桨轴承温度异常升至55°c。振动监测显示1p频率(0.25hz)分量幅值增加30%。
+
+2. 诊断过程:
+执行变桨测试发现3#桨叶角度偏差达8°,伺服阀电流波形异常。液压油颗粒度检测nas等级达9级(要求≤7级)。变桨齿面检查发现局部点蚀,齿轮间隙超标1.2mm。
+
+3. 诊断结论:
+液压变桨系统故障,特征包括:1)压力波动 2)响应延迟 3)齿轮磨损。主要原因为油液污染导致的阀件卡涩和齿轮磨损。
+
+4. 排查建议:
+1) 更换液压油及滤芯 2) 调整变桨齿轮间隙 3) 校准位置传感器 4) 优化变桨控制参数
+
+---
+
+案例6 主轴承损坏故障
+1. 现象描述:
+sg 4.0-130机组在转速14rpm时出现异常噪声,主轴轴向振动达4.2mm/s(报警值3.5mm/s)。振动频谱显示1/2倍频(0.23hz)分量显著,伴随多阶谐波。润滑脂采样发现fe含量超限(1200ppm)。
+
+2. 诊断过程:
+包络谱分析显示轴承外圈故障特征频率(3.05hz)及其谐波,时域波形存在周期性冲击。温度监测显示轴承座温差δt=15°c(前/后)。拆卸检查发现外圈滚道存在剥落,保持架变形。
+
+3. 诊断结论:
+主轴承外圈损伤故障,特征包括:1)1/2倍频振动 2)金属颗粒超标 3)保持架变形。原因系润滑不良导致的微点蚀扩展。
+
+4. 排查建议:
+1) 更换主轴承组件 2) 改进自动润滑系统 3) 安装振动在线监测装置 4) 优化轴承预紧力

+ 51 - 5
data/raw/raw_data.txt

@@ -1,9 +1,55 @@
-风电机组Siemens Gamesa SG 3.4-132型号叶轮不平衡故障案例
+案例0 叶轮不平衡故障
 1. 现象描述:
-某风电机组为Siemens Gamesa SG 3.4-132型号,额定功率为3.4 MW,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°C左右,叶根温度稳定在30°C。振动监测系统采集到的数据显示,垂直径向(Y轴)振动幅值为1.6 mm/s,水平径向(X轴)振动幅值为0.4 mm/s,轴向(Z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 Hz,而2倍转速频率(0.6 Hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
+某风电机组为siemens gamesa sg 3.4-132型号,额定功率为3.4 mw,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°c左右,叶根温度稳定在30°c。振动监测系统采集到的数据显示,垂直径向(y轴)振动幅值为1.6 mm/s,水平径向(x轴)振动幅值为0.4 mm/s,轴向(z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 hz,而2倍转速频率(0.6 hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
 2. 诊断过程:
-为了进一步确认叶片是否存在不平衡故障,运用了振动监测系统的时域分析和频谱分析功能。在频谱图中,Z轴(轴向)方向的主频峰值出现在0.3 Hz,且在0.6 Hz(2倍转速频率)处出现了明显的振动增幅,这与叶片不平衡故障的特征一致。同时,振动幅度在Y轴方向(垂直径向)出现了异常增高,说明振动的来源可能主要来自于叶轮的不平衡。为了排除齿轮箱和发电机的故障,检查了低速轴、高速轴以及行星轮的振动频率,未发现明显的异常成分,这进一步支持了叶片不平衡的诊断。
+为了进一步确认叶片是否存在不平衡故障,运用了振动监测系统的时域分析和频谱分析功能。在频谱图中,z轴(轴向)方向的主频峰值出现在0.3 hz,且在0.6 hz(2倍转速频率)处出现了明显的振动增幅,这与叶片不平衡故障的特征一致。同时,振动幅度在y轴方向(垂直径向)出现了异常增高,说明振动的来源可能主要来自于叶轮的不平衡。为了排除齿轮箱和发电机的故障,检查了低速轴、高速轴以及行星轮的振动频率,未发现明显的异常成分,这进一步支持了叶片不平衡的诊断。
 3. 诊断结论:
-根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(Y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在Z轴(轴向)方向较高,但在X轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
+根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在z轴(轴向)方向较高,但在x轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
 4. 排查建议:
-为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+
+---
+
+案例1 主轴不对中故障
+1. 现象描述:
+某SG 4.2-148型机组,额定功率4.2MW,齿轮箱为三级传动结构。在10m/s风速下运行时,主轴轴向振动值持续升高。轴向(z轴)振动幅值达2.8mm/s,水平径向(x轴)1.2mm/s,频谱显示2倍转速频率(0.8Hz)处出现显著峰值。齿轮箱输入轴温度异常升至68°C,联轴器区域可闻周期性异响。
+
+2. 诊断过程:
+通过相位分析发现x-z轴振动相位差接近180°,振动波形呈现明显"香蕉形"特征。使用激光对中仪检测发现轴向偏差达0.35mm,角向偏差0.2mm/100mm。齿轮箱振动频谱中未发现啮合频率成分,排除齿轮故障可能。
+
+3. 诊断结论:
+主轴系统存在复合型不对中故障,特征包括:1)轴向振动2倍频突出 2)相位差符合不对中特征 3)联轴器温度异常。主要原因为基础沉降导致对中状态劣化。
+
+4. 排查建议:
+1) 执行激光对中校正 2) 检查弹性联轴器磨损情况 3) 加强基础沉降监测 4) 校正后持续监测振动趋势
+
+---
+
+案例2 齿轮箱高速轴磨损故障
+1. 现象描述:
+SG 5.0-170机组在满发状态下,齿轮箱油温异常升至85°C(正常<75°C)。振动监测显示高速轴(输出轴1800rpm)径向振动达7.5mm/s,频谱中啮合频率(450Hz)两侧出现边带,间隔频率30Hz(对应高速轴转频)。油液检测发现铜元素含量超标(82ppm)。
+
+2. 诊断过程:
+时域波形呈现周期性冲击特征,包络分析显示冲击间隔与高速轴旋转周期一致。使用内窥镜检查发现高速轴轴承滚道存在剥落,齿轮啮合面可见均匀磨损痕迹。行星轮系振动特征正常,排除行星轮故障。
+
+3. 诊断结论:
+高速轴轴承磨损引发齿轮异常啮合,特征包括:1)啮合频率边带现象 2)油液金属颗粒超标 3)温度异常升高。磨损原因与润滑不良有关。
+
+4. 排查建议:
+1) 更换高速轴轴承组件 2) 清洗润滑系统并更换油品 3) 加装在线油液监测 4) 调整齿轮侧隙
+
+---
+
+案例3 齿轮箱断齿故障
+1. 现象描述:
+某SG 6.0-170机组在启停过程中出现剧烈振动,齿轮箱振动值瞬间冲高至12mm/s。频谱分析显示中速级啮合频率(187Hz)处出现明显共振峰,伴随转频(3.5Hz)边带。声发射检测到高频冲击信号,油滤发现金属碎片。
+
+2. 诊断过程:
+时域信号呈现周期性冲击衰减波形,冲击周期对应断齿齿轮的旋转周期。相位锁定分析确认故障源位于二级平行轴齿轮副。开箱检查发现中速级大齿轮存在3个连续断齿,断口呈现疲劳断裂特征。
+
+3. 诊断结论:
+齿轮箱二级传动齿轮发生断齿故障,特征包括:1)啮合频率共振峰 2)周期性冲击衰减波形 3)金属碎屑产生。根本原因为齿根应力集中导致疲劳断裂。
+
+4. 排查建议:
+1) 更换受损齿轮副 2) 进行齿面渗碳强化处理 3) 优化启停控制逻辑 4) 加装齿轮应力监测系统
+

+ 9 - 0
data/raw/raw_data_JiGong.txt

@@ -0,0 +1,9 @@
+风电机组Siemens Gamesa SG 3.4-132型号叶轮不平衡故障案例
+1. 现象描述:
+某风电机组为Siemens Gamesa SG 3.4-132型号,额定功率为3.4 MW,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°C左右,叶根温度稳定在30°C。振动监测系统采集到的数据显示,垂直径向(Y轴)振动幅值为1.6 mm/s,水平径向(X轴)振动幅值为0.4 mm/s,轴向(Z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 Hz,而2倍转速频率(0.6 Hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
+2. 诊断过程:
+为了进一步确认叶片是否存在不平衡故障,运用了振动监测系统的时域分析和频谱分析功能。在频谱图中,Z轴(轴向)方向的主频峰值出现在0.3 Hz,且在0.6 Hz(2倍转速频率)处出现了明显的振动增幅,这与叶片不平衡故障的特征一致。同时,振动幅度在Y轴方向(垂直径向)出现了异常增高,说明振动的来源可能主要来自于叶轮的不平衡。为了排除齿轮箱和发电机的故障,检查了低速轴、高速轴以及行星轮的振动频率,未发现明显的异常成分,这进一步支持了叶片不平衡的诊断。
+3. 诊断结论:
+根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(Y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在Z轴(轴向)方向较高,但在X轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
+4. 排查建议:
+为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。

+ 99 - 0
data/raw/raw_data_WindTurbine.txt

@@ -0,0 +1,99 @@
+案例0 叶轮不平衡故障
+1. 现象描述:
+某风电机组为siemens gamesa sg 3.4-132型号,额定功率为3.4 mw,采用三叶片风轮,风轮直径132米。机组的主要部件包括:叶轮(3叶片设计)、主轴(包含低速轴和高速轴)、齿轮箱(包括行星轮和两级齿轮系统)以及发电机(包括输入轴)。在风速约为9 m/s时,机组处于正常运行工况,叶轮转速为18 rpm,主轴转速为1.8 rpm,负载接近额定值。机舱温度保持在25°c左右,叶根温度稳定在30°c。振动监测系统采集到的数据显示,垂直径向(y轴)振动幅值为1.6 mm/s,水平径向(x轴)振动幅值为0.4 mm/s,轴向(z轴)振动幅值为0.5 mm/s。在频谱分析中,基频(叶轮转速)为0.3 hz,而2倍转速频率(0.6 hz)在垂直方向的振动幅值显著增加,尤其是在叶根区域的振动较为强烈。
+2. 诊断过程:
+为了进一步确认叶片是否存在不平衡故障,运用了振动监测系统的时域分析和频谱分析功能。在频谱图中,z轴(轴向)方向的主频峰值出现在0.3 hz,且在0.6 hz(2倍转速频率)处出现了明显的振动增幅,这与叶片不平衡故障的特征一致。同时,振动幅度在y轴方向(垂直径向)出现了异常增高,说明振动的来源可能主要来自于叶轮的不平衡。为了排除齿轮箱和发电机的故障,检查了低速轴、高速轴以及行星轮的振动频率,未发现明显的异常成分,这进一步支持了叶片不平衡的诊断。
+3. 诊断结论:
+根据频谱分析结果,结合振动幅值和频率特征,确认该风电机组的叶片存在不平衡故障。主要表现为:1) 在垂直径向(y轴)方向出现明显的2倍转速频率峰值;2) 振动幅值在z轴(轴向)方向较高,但在x轴方向较为平稳;3) 未发现齿轮箱或发电机相关部件的异常振动特征。综合来看,故障很可能是由于叶片质量不均匀或外部因素(如积尘、结冰、腐蚀)引起的叶片不平衡,导致振动加剧。
+4. 排查建议:
+为了彻底解决叶片不平衡问题,建议采取以下排查和修复措施:1) 实地检查叶片,检查是否存在破损、裂纹或积尘、结冰等外部因素影响,确保叶片的对称性;2) 动平衡测试,通过专业设备对叶片进行动平衡调整,减轻不平衡造成的振动;3) 进一步监测,在调整后继续监测机组的振动数据,尤其是垂直径向和轴向方向的振动,确保问题得到解决;4) 定期检查主轴轴承和齿轮箱的振动,排除其他潜在的故障源。通过这些措施,可以有效地缓解叶片不平衡对机组运行的影响,提高风电机组的可靠性和发电效率。
+
+---
+
+案例1 主轴不对中故障
+1. 现象描述:
+某SG 4.2-148型机组,额定功率4.2MW,齿轮箱为三级传动结构。在10m/s风速下运行时,主轴轴向振动值持续升高。轴向(z轴)振动幅值达2.8mm/s,水平径向(x轴)1.2mm/s,频谱显示2倍转速频率(0.8Hz)处出现显著峰值。齿轮箱输入轴温度异常升至68°C,联轴器区域可闻周期性异响。
+
+2. 诊断过程:
+通过相位分析发现x-z轴振动相位差接近180°,振动波形呈现明显"香蕉形"特征。使用激光对中仪检测发现轴向偏差达0.35mm,角向偏差0.2mm/100mm。齿轮箱振动频谱中未发现啮合频率成分,排除齿轮故障可能。
+
+3. 诊断结论:
+主轴系统存在复合型不对中故障,特征包括:1)轴向振动2倍频突出 2)相位差符合不对中特征 3)联轴器温度异常。主要原因为基础沉降导致对中状态劣化。
+
+4. 排查建议:
+1) 执行激光对中校正 2) 检查弹性联轴器磨损情况 3) 加强基础沉降监测 4) 校正后持续监测振动趋势
+
+---
+
+案例2 齿轮箱高速轴磨损故障
+1. 现象描述:
+SG 5.0-170机组在满发状态下,齿轮箱油温异常升至85°C(正常<75°C)。振动监测显示高速轴(输出轴1800rpm)径向振动达7.5mm/s,频谱中啮合频率(450Hz)两侧出现边带,间隔频率30Hz(对应高速轴转频)。油液检测发现铜元素含量超标(82ppm)。
+
+2. 诊断过程:
+时域波形呈现周期性冲击特征,包络分析显示冲击间隔与高速轴旋转周期一致。使用内窥镜检查发现高速轴轴承滚道存在剥落,齿轮啮合面可见均匀磨损痕迹。行星轮系振动特征正常,排除行星轮故障。
+
+3. 诊断结论:
+高速轴轴承磨损引发齿轮异常啮合,特征包括:1)啮合频率边带现象 2)油液金属颗粒超标 3)温度异常升高。磨损原因与润滑不良有关。
+
+4. 排查建议:
+1) 更换高速轴轴承组件 2) 清洗润滑系统并更换油品 3) 加装在线油液监测 4) 调整齿轮侧隙
+
+---
+
+案例3 齿轮箱断齿故障
+1. 现象描述:
+某SG 6.0-170机组在启停过程中出现剧烈振动,齿轮箱振动值瞬间冲高至12mm/s。频谱分析显示中速级啮合频率(187Hz)处出现明显共振峰,伴随转频(3.5Hz)边带。声发射检测到高频冲击信号,油滤发现金属碎片。
+
+2. 诊断过程:
+时域信号呈现周期性冲击衰减波形,冲击周期对应断齿齿轮的旋转周期。相位锁定分析确认故障源位于二级平行轴齿轮副。开箱检查发现中速级大齿轮存在3个连续断齿,断口呈现疲劳断裂特征。
+
+3. 诊断结论:
+齿轮箱二级传动齿轮发生断齿故障,特征包括:1)啮合频率共振峰 2)周期性冲击衰减波形 3)金属碎屑产生。根本原因为齿根应力集中导致疲劳断裂。
+
+4. 排查建议:
+1) 更换受损齿轮副 2) 进行齿面渗碳强化处理 3) 优化启停控制逻辑 4) 加装齿轮应力监测系统
+
+---
+
+案例4 发电机高温故障
+1. 现象描述:
+SG 4.5-155机组发电机定子温度持续超过155°C(报警阈值150°C),冷却系统出口风温达65°C。振动监测显示2倍线频(100Hz)分量增加,绝缘电阻测试显示B相绕组对地绝缘降至0.8MΩ。功率输出波动±8%。
+
+2. 诊断过程:
+热成像检测发现定子铁芯局部过热点(温差ΔT=25°C)。绕组直流电阻测试显示三相不平衡度达7%。局放检测发现典型槽放电信号,频率成分集中在3-15MHz范围。
+
+3. 诊断结论:
+发电机定子绕组绝缘劣化导致高温故障,特征包括:1)局部过热点 2)绝缘电阻下降 3)放电信号。原因系长期运行导致的绝缘老化。
+
+4. 排查建议:
+1) 更换受损绕组 2) 清洗冷却风道 3) 加装光纤测温系统 4) 开展定期绝缘老化试验
+
+---
+
+案例5 变桨系统故障
+1. 现象描述:
+SG 3.6-140机组在风速变化时出现功率振荡,变桨角度响应延迟达6秒(正常<2秒)。液压系统压力波动范围±12bar,变桨轴承温度异常升至55°C。振动监测显示1P频率(0.25Hz)分量幅值增加30%。
+
+2. 诊断过程:
+执行变桨测试发现3#桨叶角度偏差达8°,伺服阀电流波形异常。液压油颗粒度检测NAS等级达9级(要求≤7级)。变桨齿面检查发现局部点蚀,齿轮间隙超标1.2mm。
+
+3. 诊断结论:
+液压变桨系统故障,特征包括:1)压力波动 2)响应延迟 3)齿轮磨损。主要原因为油液污染导致的阀件卡涩和齿轮磨损。
+
+4. 排查建议:
+1) 更换液压油及滤芯 2) 调整变桨齿轮间隙 3) 校准位置传感器 4) 优化变桨控制参数
+
+---
+
+案例6 主轴承损坏故障
+1. 现象描述:
+SG 4.0-130机组在转速14rpm时出现异常噪声,主轴轴向振动达4.2mm/s(报警值3.5mm/s)。振动频谱显示1/2倍频(0.23Hz)分量显著,伴随多阶谐波。润滑脂采样发现Fe含量超限(1200ppm)。
+
+2. 诊断过程:
+包络谱分析显示轴承外圈故障特征频率(3.05Hz)及其谐波,时域波形存在周期性冲击。温度监测显示轴承座温差ΔT=15°C(前/后)。拆卸检查发现外圈滚道存在剥落,保持架变形。
+
+3. 诊断结论:
+主轴承外圈损伤故障,特征包括:1)1/2倍频振动 2)金属颗粒超标 3)保持架变形。原因系润滑不良导致的微点蚀扩展。
+
+4. 排查建议:
+1) 更换主轴承组件 2) 改进自动润滑系统 3) 安装振动在线监测装置 4) 优化轴承预紧力

+ 32 - 0
data/your_dataset.json

@@ -0,0 +1,32 @@
+[
+    {
+        "instruction": "解释量子计算的基本原理",
+        "input": "",
+        "output": "量子计算是一种利用量子力学原理(如叠加态和纠缠态)进行信息处理的计算方式。与传统计算机使用比特(0 或 1)不同,量子计算机使用量子比特(qubit),可以同时处于多个状态的叠加中,从而在某些问题上实现指数级的计算速度提升。"
+    },
+    {
+        "instruction": "将以下句子翻译成英语",
+        "input": "今天的天气非常好,适合去公园散步。",
+        "output": "The weather today is very nice, perfect for a walk in the park."
+    },
+    {
+        "instruction": "写一首关于秋天的诗",
+        "input": "",
+        "output": "秋风轻拂叶金黄,\n果实累累满园香。\n远山如画映斜阳,\n丰收时节喜洋洋。"
+    },
+    {
+        "instruction": "计算以下数学表达式的结果",
+        "input": "3 * (4 + 5) - 6 / 2",
+        "output": "3 * (4 + 5) - 6 / 2 = 3 * 9 - 3 = 27 - 3 = 24"
+    },
+    {
+        "instruction": "列出 Python 中常用的数据类型",
+        "input": "",
+        "output": "Python 中常用的数据类型包括:\n1. 整数(int)\n2. 浮点数(float)\n3. 字符串(str)\n4. 列表(list)\n5. 元组(tuple)\n6. 字典(dict)\n7. 集合(set)\n8. 布尔值(bool)"
+    },
+    {
+        "instruction": "如何预防感冒?",
+        "input": "",
+        "output": "预防感冒的方法包括:\n1. 勤洗手,保持个人卫生。\n2. 避免与感冒患者密切接触。\n3. 保持充足的睡眠和均衡的饮食。\n4. 多喝水,保持身体水分充足。\n5. 适当锻炼,增强免疫力。\n6. 在流感季节接种流感疫苗。"
+    }
+]

+ 99 - 0
src/UnslothApp.py

@@ -0,0 +1,99 @@
+# 环境安装(首次运行前执行)
+# pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
+# pip install --no-deps "xformers<0.0.26" trl peft accelerate bitsandbytes
+# pip install unsloth vllm
+# pip install diffusers
+
+from unsloth import FastLanguageModel
+import torch
+from datasets import load_dataset
+from trl import SFTTrainer
+from transformers import TrainingArguments
+
+# 模型配置
+model_name = "deepseek-ai/deepseek-r1"  # Hugging Face模型ID
+max_seq_length = 2048  # 根据GPU内存调整
+dtype = None  # None自动选择,或指定torch.float16/torch.bfloat16
+load_in_4bit = True  # 4bit量化节省内存
+
+# 加载模型
+model, tokenizer = FastLanguageModel.from_pretrained(
+    model_name=model_name,
+    max_seq_length=max_seq_length,
+    dtype=dtype,
+    load_in_4bit=load_in_4bit,
+)
+
+# 添加LoRA适配器(参数高效微调)
+model = FastLanguageModel.get_peft_model(
+    model,
+    r=16,  # LoRA秩
+    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
+    lora_alpha=16,
+    lora_dropout=0,
+    bias="none",
+    use_gradient_checkpointing=True,
+)
+
+# 准备数据集示例(需替换为实际数据)
+dataset = load_dataset("json", data_files="your_dataset.json", split="train")
+
+def formatting_prompts_func(examples):
+    # 根据DeepSeek的指令格式构建prompt
+    instructions = examples["instruction"]
+    inputs = examples["input"]
+    outputs = examples["output"]
+    
+    texts = []
+    for instruction, input, output in zip(instructions, inputs, outputs):
+        text = f"### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Response:\n{output}"
+        texts.append(text)
+    return {"text" : texts}
+
+dataset = dataset.map(formatting_prompts_func, batched=True)
+
+# 训练参数配置
+trainer = SFTTrainer(
+    model=model,
+    tokenizer=tokenizer,
+    train_dataset=dataset,
+    dataset_text_field="text",
+    max_seq_length=max_seq_length,
+    dataset_num_proc=2,
+    args=TrainingArguments(
+        per_device_train_batch_size=2,
+        gradient_accumulation_steps=4,
+        warmup_steps=5,
+        max_steps=100,
+        learning_rate=2e-5,
+        fp16=not torch.cuda.is_bf16_supported(),
+        bf16=torch.cuda.is_bf16_supported(),
+        logging_steps=1,
+        optim="adamw_8bit",
+        weight_decay=0.01,
+        lr_scheduler_type="linear",
+        seed=42,
+        output_dir="outputs",
+    ),
+)
+
+# 执行训练(启用Unsloth优化)
+trainer.train()
+
+# 保存适配器权重
+model.save_pretrained("lora_adapter")
+
+# 推理示例
+FastLanguageModel.for_inference(model)  # 启用优化推理模式
+inputs = tokenizer(
+    "### Instruction:\n解释量子计算的基本原理\n\n### Response:",
+    return_tensors="pt",
+).to("cuda")
+
+outputs = model.generate(
+    **inputs,
+    max_new_tokens=256,
+    temperature=0.7,
+    do_sample=True,
+)
+print(tokenizer.decode(outputs[0], skip_special_tokens=True))

BIN
src/__pycache__/config.cpython-39.pyc


BIN
src/__pycache__/model_trainer.cpython-39.pyc


+ 1 - 1
src/config.py

@@ -33,7 +33,7 @@ class Config:
     BATCH_SIZE = 16 # 32  # 每个训练批次中的样本数量。较大的批次大小可以提高训练速度,但会占用更多显存。
     EPOCHS = 10      # 训练的总轮数。每一轮会遍历整个数据集一次。
     LEARNING_RATE = 1e-4  # 1e-4 # 学习率,控制模型参数更新的步长。较小的学习率会使训练更稳定,但可能需要更多轮数才能收敛。
-    SEQ_LENGTH = 512  # 输入序列的最大长度。较长的序列可以捕捉更多上下文信息,但会增加计算和显存开销。
+    SEQ_LENGTH = 9126  # 输入序列的最大长度。较长的序列可以捕捉更多上下文信息,但会增加计算和显存开销。
     NUM_WORKERS=4 
     
     # 运行参数

+ 14 - 57
src/model_trainer.py

@@ -1,12 +1,10 @@
+# model_trainer.py
 import torch
 from torch.utils.data import Dataset, DataLoader
-from torch.optim import AdamW
-from torch.quantization import quantize_dynamic  # 导入量化工具
-from transformers import AutoTokenizer, AutoModelForCausalLM, get_linear_schedule_with_warmup
+from transformers import AutoTokenizer, AutoModelForCausalLM, AdamW
 from src.config import Config
 import logging
 import os
-from torch.amp import autocast, GradScaler
 
 logging.basicConfig(level=logging.INFO)
 logger = logging.getLogger(__name__)
@@ -35,15 +33,13 @@ class TextDataset(Dataset):
 class ModelTrainer:
     def __init__(self):
         """初始化模型、分词器和优化器"""
-        self.modelId = Config.PRETRAINED_MODEL_DIR
         self.device = Config.DEVICE
         logger.info(f"Using device: {self.device}")
-        logger.info(f"model id: {self.modelId}")
 
         try:
             # 加载分词器和模型
-            self.tokenizer = AutoTokenizer.from_pretrained(self.modelId)
-            self.model = AutoModelForCausalLM.from_pretrained(self.modelId)
+            self.tokenizer = AutoTokenizer.from_pretrained(Config.PRETRAINED_MODEL_DIR)
+            self.model = AutoModelForCausalLM.from_pretrained(Config.PRETRAINED_MODEL_DIR)
             self.model.to(self.device)  # 将模型移动到设备
             logger.info("Pretrained model and tokenizer loaded.")
         except Exception as e:
@@ -57,72 +53,33 @@ class ModelTrainer:
             dataset = TextDataset(Config.PROCESSED_DATA_PATH, self.tokenizer, Config.SEQ_LENGTH)
             dataloader = DataLoader(dataset, batch_size=Config.BATCH_SIZE, shuffle=True, num_workers=Config.NUM_WORKERS)
 
-            # 初始化优化器和学习率调度器
+            # 初始化优化器
             optimizer = AdamW(self.model.parameters(), lr=Config.LEARNING_RATE)
-            total_steps = len(dataloader) * Config.EPOCHS
-            scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=100, num_training_steps=total_steps)
-
-            # 混合精度训练
-            scaler = GradScaler(enabled=Config.USE_FP16)  # 移除 device_type 参数
 
             # 训练循环
             self.model.train()
             for epoch in range(Config.EPOCHS):
-                for i, batch in enumerate(dataloader):
+                for batch in dataloader:
                     # 将输入数据移动到设备
                     inputs = batch.to(self.device)
                     
                     # 前向传播
-                    with autocast(device_type="cuda", enabled=Config.USE_FP16):  # 使用新的 autocast
-                        outputs = self.model(inputs, labels=inputs)
-                        loss = outputs.loss # / Config.GRADIENT_ACCUMULATION_STEPS  # 归一化损失
+                    outputs = self.model(inputs, labels=inputs)
+                    loss = outputs.loss
                     
                     # 反向传播和优化
-                    scaler.scale(loss).backward()  # 缩放损失并反向传播
-                    if (i + 1) % Config.GRADIENT_ACCUMULATION_STEPS == 0:
-                        scaler.step(optimizer)  # 更新参数
-                        scaler.update()  # 更新缩放器
-                        optimizer.zero_grad()
-                        scheduler.step()  # 更新学习率
+                    loss.backward()
+                    optimizer.step()
+                    optimizer.zero_grad()
 
                 logger.info(f"Epoch {epoch + 1}/{Config.EPOCHS}, Loss: {loss.item()}")
 
             # 保存训练后的模型
             os.makedirs(Config.TRAINED_MODEL_DIR, exist_ok=True)
-            # self.model.save_pretrained(Config.TRAINED_MODEL_DIR)
-            # self.tokenizer.save_pretrained(Config.TRAINED_MODEL_DIR)
-            # logger.info(f"Model saved to {Config.TRAINED_MODEL_DIR}")
-
-            # 量化模型
-            self.quantize_model()
+            self.model.save_pretrained(Config.TRAINED_MODEL_DIR)
+            self.tokenizer.save_pretrained(Config.TRAINED_MODEL_DIR)
+            logger.info(f"Model saved to {Config.TRAINED_MODEL_DIR}")
 
         except Exception as e:
             logger.error(f"Training failed: {e}")
             raise
-
-    def quantize_model(self):
-        """量化模型"""
-        try:
-            logger.info("Quantizing model...")
-            # 将模型移动到 CPU(量化需要在 CPU 上进行)
-            self.model.to("cpu")
-
-            # 动态量化(Q4)
-            quantized_model = quantize_dynamic(
-                self.model,  # 原始模型
-                {torch.nn.Linear},  # 需要量化的层类型
-                dtype=torch.qint8  # 量化精度(Q4)
-            )
-
-            # 保存量化后的模型
-            # quantized_model_dir = os.path.join(Config.TRAINED_MODEL_DIR, "quantized")
-
-            quantized_model.save_pretrained(Config.TRAINED_MODEL_DIR)
-            quantized_model.save_pretrained(Config.TRAINED_MODEL_DIR)
-            # os.makedirs(quantized_model_dir, exist_ok=True)
-            # torch.save(quantized_model.state_dict(), os.path.join(quantized_model_dir, "quantized_model.pth"))
-            logger.info(f"Quantized model saved to {Config.TRAINED_MODEL_DIR}")
-
-        except Exception as e:
-            logger.error(f"Quantization failed: {e}")
-            raise

+ 0 - 85
src/model_trainer_v1.py

@@ -1,85 +0,0 @@
-# model_trainer.py
-import torch
-from torch.utils.data import Dataset, DataLoader
-from transformers import AutoTokenizer, AutoModelForCausalLM, AdamW
-from src.config import Config
-import logging
-import os
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-class TextDataset(Dataset):
-    """自定义数据集类"""
-    def __init__(self, file_path, tokenizer, seq_length):
-        self.tokenizer = tokenizer
-        self.seq_length = seq_length
-        with open(file_path, "r", encoding="utf-8") as f:
-            self.lines = f.read().splitlines()
-
-    def __len__(self):
-        return len(self.lines)
-
-    def __getitem__(self, idx):
-        line = self.lines[idx]
-        tokens = self.tokenizer.encode(
-            line, 
-            max_length=self.seq_length, 
-            truncation=True, 
-            padding="max_length"
-        )
-        return torch.tensor(tokens)  # 返回 CPU 上的张量
-
-class ModelTrainer:
-    def __init__(self):
-        """初始化模型、分词器和优化器"""
-        self.device = Config.DEVICE
-        logger.info(f"Using device: {self.device}")
-
-        try:
-            # 加载分词器和模型
-            self.tokenizer = AutoTokenizer.from_pretrained(Config.PRETRAINED_MODEL_DIR)
-            self.model = AutoModelForCausalLM.from_pretrained(Config.PRETRAINED_MODEL_DIR)
-            self.model.to(self.device)  # 将模型移动到设备
-            logger.info("Pretrained model and tokenizer loaded.")
-        except Exception as e:
-            logger.error(f"Failed to load pretrained model: {e}")
-            raise
-
-    def train(self):
-        """训练模型"""
-        try:
-            # 加载数据集
-            dataset = TextDataset(Config.PROCESSED_DATA_PATH, self.tokenizer, Config.SEQ_LENGTH)
-            dataloader = DataLoader(dataset, batch_size=Config.BATCH_SIZE, shuffle=True, num_workers=Config.NUM_WORKERS)
-
-            # 初始化优化器
-            optimizer = AdamW(self.model.parameters(), lr=Config.LEARNING_RATE)
-
-            # 训练循环
-            self.model.train()
-            for epoch in range(Config.EPOCHS):
-                for batch in dataloader:
-                    # 将输入数据移动到设备
-                    inputs = batch.to(self.device)
-                    
-                    # 前向传播
-                    outputs = self.model(inputs, labels=inputs)
-                    loss = outputs.loss
-                    
-                    # 反向传播和优化
-                    loss.backward()
-                    optimizer.step()
-                    optimizer.zero_grad()
-
-                logger.info(f"Epoch {epoch + 1}/{Config.EPOCHS}, Loss: {loss.item()}")
-
-            # 保存训练后的模型
-            os.makedirs(Config.TRAINED_MODEL_DIR, exist_ok=True)
-            self.model.save_pretrained(Config.TRAINED_MODEL_DIR)
-            self.tokenizer.save_pretrained(Config.TRAINED_MODEL_DIR)
-            logger.info(f"Model saved to {Config.TRAINED_MODEL_DIR}")
-
-        except Exception as e:
-            logger.error(f"Training failed: {e}")
-            raise

+ 128 - 0
src/model_trainer_v2.3_no.py

@@ -0,0 +1,128 @@
+import torch
+from torch.utils.data import Dataset, DataLoader
+# from torch.optim import AdamW
+from torch.quantization import quantize_dynamic  # 导入量化工具
+from transformers import AutoTokenizer, AutoModelForCausalLM, get_linear_schedule_with_warmup,AdamW
+from src.config import Config
+import logging
+import os
+from torch.amp import autocast, GradScaler
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
+class TextDataset(Dataset):
+    """自定义数据集类"""
+    def __init__(self, file_path, tokenizer, seq_length):
+        self.tokenizer = tokenizer
+        self.seq_length = seq_length
+        with open(file_path, "r", encoding="utf-8") as f:
+            self.lines = f.read().splitlines()
+
+    def __len__(self):
+        return len(self.lines)
+
+    def __getitem__(self, idx):
+        line = self.lines[idx]
+        tokens = self.tokenizer.encode(
+            line, 
+            max_length=self.seq_length, 
+            truncation=True, 
+            padding="max_length"
+        )
+        return torch.tensor(tokens)  # 返回 CPU 上的张量
+
+class ModelTrainer:
+    def __init__(self):
+        """初始化模型、分词器和优化器"""
+        self.modelId = Config.PRETRAINED_MODEL_DIR
+        self.device = Config.DEVICE
+        logger.info(f"Using device: {self.device}")
+        logger.info(f"model id: {self.modelId}")
+
+        try:
+            # 加载分词器和模型
+            self.tokenizer = AutoTokenizer.from_pretrained(self.modelId)
+            self.model = AutoModelForCausalLM.from_pretrained(self.modelId)
+            self.model.to(self.device)  # 将模型移动到设备
+            logger.info("Pretrained model and tokenizer loaded.")
+        except Exception as e:
+            logger.error(f"Failed to load pretrained model: {e}")
+            raise
+
+    def train(self):
+        """训练模型"""
+        try:
+            # 加载数据集
+            dataset = TextDataset(Config.PROCESSED_DATA_PATH, self.tokenizer, Config.SEQ_LENGTH)
+            dataloader = DataLoader(dataset, batch_size=Config.BATCH_SIZE, shuffle=True, num_workers=Config.NUM_WORKERS)
+
+            # 初始化优化器和学习率调度器
+            optimizer = AdamW(self.model.parameters(), lr=Config.LEARNING_RATE)
+            total_steps = len(dataloader) * Config.EPOCHS
+            scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=100, num_training_steps=total_steps)
+
+            # 混合精度训练
+            scaler = GradScaler(enabled=Config.USE_FP16)  # 移除 device_type 参数
+
+            # 训练循环
+            self.model.train()
+            for epoch in range(Config.EPOCHS):
+                for i, batch in enumerate(dataloader):
+                    # 将输入数据移动到设备
+                    inputs = batch.to(self.device)
+                    
+                    # 前向传播
+                    with autocast(device_type="cuda", enabled=Config.USE_FP16):  # 使用新的 autocast
+                        outputs = self.model(inputs, labels=inputs)
+                        loss = outputs.loss # / Config.GRADIENT_ACCUMULATION_STEPS  # 归一化损失
+                    
+                    # 反向传播和优化
+                    scaler.scale(loss).backward()  # 缩放损失并反向传播
+                    if (i + 1) % Config.GRADIENT_ACCUMULATION_STEPS == 0:
+                        scaler.step(optimizer)  # 更新参数
+                        scaler.update()  # 更新缩放器
+                        optimizer.zero_grad()
+                        scheduler.step()  # 更新学习率
+
+                logger.info(f"Epoch {epoch + 1}/{Config.EPOCHS}, Loss: {loss.item()}")
+
+            # 保存训练后的模型
+            os.makedirs(Config.TRAINED_MODEL_DIR, exist_ok=True)
+            # self.model.save_pretrained(Config.TRAINED_MODEL_DIR)
+            # self.tokenizer.save_pretrained(Config.TRAINED_MODEL_DIR)
+            # logger.info(f"Model saved to {Config.TRAINED_MODEL_DIR}")
+
+            # 量化模型
+            self.quantize_model()
+
+        except Exception as e:
+            logger.error(f"Training failed: {e}")
+            raise
+
+    def quantize_model(self):
+        """量化模型"""
+        try:
+            logger.info("Quantizing model...")
+            # 将模型移动到 CPU(量化需要在 CPU 上进行)
+            self.model.to("cpu")
+
+            # 动态量化(Q4)
+            quantized_model = quantize_dynamic(
+                self.model,  # 原始模型
+                {torch.nn.Linear},  # 需要量化的层类型
+                dtype=torch.qint8  # 量化精度(Q4)
+            )
+
+            # 保存量化后的模型
+            # quantized_model_dir = os.path.join(Config.TRAINED_MODEL_DIR, "quantized")
+
+            quantized_model.save_pretrained(Config.TRAINED_MODEL_DIR)
+            self.tokenizer.save_pretrained(Config.TRAINED_MODEL_DIR)
+            # os.makedirs(quantized_model_dir, exist_ok=True)
+            # torch.save(quantized_model.state_dict(), os.path.join(quantized_model_dir, "quantized_model.pth"))
+            logger.info(f"Quantized model saved to {Config.TRAINED_MODEL_DIR}")
+
+        except Exception as e:
+            logger.error(f"Quantization failed: {e}")
+            raise