1.
问题:
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 39.59 GiB total capacity; 37.72 GiB already allocated; 38.19 MiB free; 37.83 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
解决方法:
减小batch大小,可以减小每一批次的内存使用。批大小:24➡️12➡️6
减小批量大小(batch size)有几个潜在的好处:
-
减少内存占用: 更小的批量大小意味着每个批次需要的内存更少,这有助于减少GPU内存的占用。特别是在处理大型模型或者数据集时,较小的批量大小可以降低内存消耗,从而减少因内存不足而导致的错误。
-
加快训练速度: 较小的批量大小可能会导致更频繁的参数更新,这有助于加快模型的训练速度。虽然每轮迭代的计算量可能会增加,但由于参数更新更加频繁,整体上可以获得更快的收敛速度。
-
泛化能力: 一些研究表明,通过减小批量大小,模型可能会更好地泛化到新的数据上,从而提高模型的性能。
尽管减小批量大小具有上述好处,但也存在一些潜在的问题:
-
训练时间延长: 由于参数更新更频繁,整体训练时间可能会延长,尤其是在处理较大的数据集时。
-
训练稳定性: 对于某些模型和数据集,较小的批量大小可能导致训练过程的不稳定性,包括震荡、收敛速度下降等问题。
2.
问题:
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0!
解决;
找到报错的位置,在方法体内,把张量后面加上.to('cuda:0')
补充:
张量(tensor)是深度学习中的一种数据结构,类似于多维数组。在PyTorch等深度学习框架中,张量是进行数值计算的基本数据类型,用来存储和处理数据以及执行各种运算。
张量可以是多维的,可以是标量(0维张量)、向量(1维张量)、矩阵(2维张量)甚至更高维度的数组。在深度学习中,神经网络的输入、输出和参数通常都表示为张量,通过张量之间的运算来实现神经网络模型的训练和推理过程。
张量支持各种数学运算,如加法、减法、乘法、除法、矩阵乘法等,同时也支持广播(broadcasting)、切片(slicing)等操作。在深度学习中,张量是非常重要的数据类型,对于构建和训练神经网络模型起着关键作用。
3.
问题:
AttributeError: 'list' object has no attribute 'float'
4.在计算loss的时候,出现了loss:nan的情况
解决:
(1)推测是值太小,loss = criterion(outputs, batch_y+1e-5) ➡️ loss = criterion(outputs, batch_y+1e-5),但更改后并未解决问题
(2)推测是数据精度问题,如bf16和fp16,但改变精度后并未解决问题
补:
(3)修改学习率learning_rate=0.01 ➡️ 0.001,目前效果良好
学习率在深度学习训练中起着非常重要的作用,它决定了模型参数在每次迭代中更新的幅度。学习率的高低对训练过程和结果有着直接影响:
-
学习率过高:
- 如果学习率设置过高,可能导致参数更新过大,使得模型在参数空间内来回波动,甚至出现数值溢出,最终导致训练不稳定或损失函数出现 NaN。
- 高学习率可能会导致模型无法收敛到最优解,甚至完全偏离最优解,从而影响模型的性能。
-
学习率过低:
- 如果学习率设置过低,模型参数更新的幅度较小,可能导致模型收敛速度过慢,需要更多的迭代次数才能达到收敛状态。
- 过低的学习率也可能导致模型陷入局部最优解或者鞍点,难以跳出局部最优解找到更好的全局最优解。
补充:
1.
2.
4.
问题:
当前 PyTorch 安装不支持 A100-SXM4-40GB GPU 的 CUDA 计算能力(sm_80),而只支持 CUDA 计算能力为 sm_37、sm_50、sm_60 和 sm_70 的设备。
A100-SXM4-40GB with CUDA capability sm_80 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
解决方法:
疑似torch版本较低
torch版本由1.12.1 ➡️ 2.0.1
5.
问题:
安装的jax为:pip install -U jax[cpu],无需gpu,但出现下面错误:
An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.
解决方法:
不用管。我当时安装的是不需要 GPU 的版本,但 JAX 在初始化时仍会检查 CUDA 相关的库,因此会出现这样的报错信息。这个报错并不影响您使用 CPU 版本的 JAX 进行计算,只是提示系统中可能存在 NVIDIA GPU,但当前未安装 CUDA-enabled jaxlib。
6.
问题:
grad requires real- or complex-valued inputs (input dtype that is a sub-dtype of np.inexact), but got int32. If you want to use Boolean- or integer-valued inputs, use vjp or set allow_int to True.
解决:
报错是关于输入数据类型不符合 grad
函数要求的问题,应该为浮点数。
函数接收两个数组input_arr
和target_arr
作为输入。确保这些数组在经过任何变换之前就是浮点数类型。这可以通过在函数开始处添加类型转换来实现:
input_arr = input_arr.astype(np.float32)
target_arr = target_arr.astype(np.float32)
在使用大模型进行时序推理时,可以将数据和时间数据结合起来的一种常见方法是将它们作为输入文本的一部分进行编码。
首先,您需要将数据和时间数据转换为文本格式。例如,将数据转换为字符串形式,将时间数据转换为适当的时间格式字符串。
然后,您可以将数据和时间信息组合成一个字符串,以便将其作为单个输入传递给模型。例如,可以使用特定的分隔符将数据和时间数据连接在一起。
接下来,您需要使用分词器对组合后的字符串进行编码。使用分词器的 tokenizer.encode
方法可以将输入字符串转换为标记 ID 序列。
最后,将编码后的标记 ID 序列作为输入传递给模型进行推理。
1.使用tokenization对输入字符进行编码,编码规则如下:
(1)缩放
参数:history (array-like): Data to derive scaling from.
beta (float, optional): Shift parameter. Defaults to .3.
alpha (float, optional): Quantile for scaling. Defaults to .95.
公式:计算最小值 min_
,它是历史数据的最小值减去 beta 倍历史数据极差的结果;通过计算历史数据减去最小值 min_
的 alpha 分位数,得到缩放因子 q;
如果缩放因子 q
的计算结果为零,则将其设置为 1,以避免除以零的错误;将历史数据其除以缩放因子 q
进行特征变换。
min_ = np.min(history) - beta*(np.max(history)-np.min(history))
q = np.quantile(history-min_, alpha)
if q == 0: q = 1
(2)序列化:将时间序列转化为文本
- 首先,函数会检查数组中的数值是否在规定范围内,即绝对值是否小于等于
settings.max_val
。 - 接下来,根据设置的符号位情况,确定正负号的字符串表示形式。
- 使用
vec_num2repr
函数,将数组中的每个数字转换为指定基数和精度的字符串表示形式。同时,将缺失值(NaN)转换为零。 - 根据设置的分隔符,将符号位、数字位和缺失值进行拼接,并生成一系列的位字符串。
- 最后,将位字符串按照时间步之间的分隔符连接起来,并在末尾添加一个额外的分隔符,以避免在最后一个时间步中数字位数不明确。
参数:精度为2,即3.5变成350,0.51变成51,32变成3200
规则:1)将数组中的每个数字转换为指定基数和精度的字符串表示形式,精度为2,即保留两两位小数, 2)将缺失值(' ')转换为零 3)将符号位、数字位和缺失值进行拼接,并生成一系列的位字符串.
示例为:'3.5,22,0,-3.89,3.567'变成'3 5 0 ,2 2 , , - 3 8 9 ,3 5 6 ,'
一、 .env文件
问:PATHS.CHECKPOINTS_DIR的值是什么,在哪里得到
import os
from dataclasses import dataclass
from dotenv import load_dotenv
load_dotenv(override=True)
@dataclass
class TASKS:
PRETRAINING: str = "pre-training"
LONG_HORIZON_FORECASTING: str = "long-horizon-forecasting"
SHORT_HORIZON_FORECASTING: str = "short-horizon-forecasting"
CLASSIFICATION: str = "classification"
IMPUTATION: str = "imputation"
ANOMALY_DETECTION: str = "anomaly-detection"
EMBED: str = "embed"
def set_transformers_cache_path(transformers_cache_path : str):
os.environ["TRANSFORMERS_CACHE"] = transformers_cache_path
@dataclass
class PATHS:
DATA_DIR: str = os.getenv("MOMENT_DATA_DIR")
CHECKPOINTS_DIR: str = os.getenv("MOMENT_CHECKPOINTS_DIR")
RESULTS_DIR: str = os.getenv("MOMENT_RESULTS_DIR")
WANDB_DIR: str = os.getenv("WANDB_DIR")
答:
在这段代码中,PATHS.CHECKPOINTS_DIR
的值应该是由环境变量MOMENT_CHECKPOINTS_DIR
的值决定的。这个值可能在.env
文件中定义,然后使用dotenv
模块加载。
.env
文件是一个文本文件,通常用于存储环境变量的键值对。它可以包含应用程序的配置信息,例如数据库连接字符串、API密钥等敏感信息。.env
文件通常位于项目的根目录下,命名为.env
。
你可以在项目的根目录下查找.env
文件。如果找不到,可能需要创建一个新的.env
文件,并在其中定义所需的环境变量。.env
文件的格式通常是一行一个键值对,例如:
MOMENT_DATA_DIR=/path/to/data
MOMENT_CHECKPOINTS_DIR=/path/to/checkpoints
MOMENT_RESULTS_DIR=/path/to/results
WANDB_DIR=/path/to/wandb
在文件根目录下,通过vim .env来进行编辑
二、We couldn't connect to 'https://huggingface.co' to load this file