微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Raytune 在尝试超参数搜索时抛出错误:“模块‘pickle’没有属性‘PickleBuffer’”

如何解决Raytune 在尝试超参数搜索时抛出错误:“模块‘pickle’没有属性‘PickleBuffer’”

我或多或少遵循 this example 使用我自己的数据集将光线调谐超参数库与 Huggingface Transformers 库集成。

这是我的脚本:

import ray
from ray import tune
from ray.tune import CLIReporter
from ray.tune.examples.pbt_transformers.utils import download_data,\
    build_compute_metrics_fn
from ray.tune.schedulers import PopulationBasedTraining
from transformers import glue_tasks_num_labels,AutoConfig,\
    AutoModelForSequenceClassification,AutoTokenizer,Trainer,TrainingArguments

def get_model():
    # tokenizer = AutoTokenizer.from_pretrained(model_name,additional_special_tokens = ['[CHaraCTER]'])
    model = ElectraForSequenceClassification.from_pretrained('google/electra-small-discriminator',num_labels=2)
    model.resize_token_embeddings(len(tokenizer))
    return model

from sklearn.metrics import accuracy_score,precision_recall_fscore_support
def compute_metrics(pred):
    labels = pred.label_ids
    preds = pred.predictions.argmax(-1)
    precision,recall,f1,_ = precision_recall_fscore_support(labels,preds,average='weighted')
    acc = accuracy_score(labels,preds)
    return {
        'accuracy': acc,'f1': f1,'precision': precision,'recall': recall
    }

training_args = TrainingArguments(
    "electra_hp_tune",report_to = "wandb",learning_rate=2e-5,# config
    do_train=True,do_eval=True,evaluation_strategy="epoch",load_best_model_at_end=True,num_train_epochs=2,# config
    per_device_train_batch_size=16,# config
    per_device_eval_batch_size=16,# config
    warmup_steps=0,weight_decay=0.1,# config
    logging_dir="./logs",)

trainer = Trainer(
    model_init=get_model,args=training_args,train_dataset=chunked_encoded_dataset['train'],eval_dataset=chunked_encoded_dataset['validation'],compute_metrics=compute_metrics
)

tune_config = {
    "per_device_train_batch_size": 32,"per_device_eval_batch_size": 32,"num_train_epochs": tune.choice([2,3,4,5])
}

scheduler = PopulationBasedTraining(
    time_attr="training_iteration",metric="eval_acc",mode="max",perturbation_interval=1,hyperparam_mutations={
        "weight_decay": tune.uniform(0.0,0.3),"learning_rate": tune.uniform(1e-5,2.5e-5),"per_device_train_batch_size": [16,32,64],})

reporter = CLIReporter(
    parameter_columns={
        "weight_decay": "w_decay","learning_rate": "lr","per_device_train_batch_size": "train_bs/gpu","num_train_epochs": "num_epochs"
    },metric_columns=[
        "eval_f1","eval_loss","epoch","training_iteration"
    ])

from ray.tune.integration.wandb import WandbLogger
trainer.hyperparameter_search(
    hp_space=lambda _: tune_config,backend="ray",n_trials=10,scheduler=scheduler,keep_checkpoints_num=1,checkpoint_score_attr="training_iteration",progress_reporter=reporter,name="tune_transformer_gr")

最后一个函数调用(到 trainer.hyperparameter_search)是在引发错误时。错误信息是:

属性错误:模块“pickle”没有属性“PickleBuffer”

这里是完整的堆栈跟踪:


AttributeError Traceback(最近一次调用 最后)

在 () 8 checkpoint_score_attr="training_iteration",9 progress_reporter=记者, ---> 10 name="tune_transformer_gr")

14 帧

/usr/local/lib/python3.7/dist-packages/transformers/trainer.py 中 超参数搜索(自我,hp_space,compute_objective,n_trials, 方向、后端、hp_name、**kwargs)1666 1667
run_hp_search = run_hp_search_optuna 如果后端 == HPSearchBackend.OPTUNA else run_hp_search_ray -> 1668 best_run = run_hp_search(self,n_trials,direction,**kwargs) 1669 1670 self.hp_search_backend = None

/usr/local/lib/python3.7/dist-packages/transformers/integrations.py 中 run_hp_search_ray(教练,n_trials,方向,**kwargs) 231 第232话 --> 233 ray.tune.with_parameters(_objective,local_trainer=trainer),234 config=trainer.hp_space(无), 235 num_samples=n_trials,

/usr/local/lib/python3.7/dist-packages/ray/tune/utils/trainable.py 中 with_parameters(可训练,**kwargs) 294 前缀 = f"{str(trainable)}_" kwargs.items() 中的 k、v 为 295: --> 296 parameter_registry.put(prefix + k,v) 297 第 298 章

/usr/local/lib/python3.7/dist-packages/ray/tune/registry.py 中 放(自我,k,v) 160 self.to_flush[k] = v 第161话 --> 162 self.flush() 163 164 def get(self,k):

/usr/local/lib/python3.7/dist-packages/ray/tune/registry.py 中 冲洗(自我) 第169话 170 for k,v in self.to_flush.items(): --> 171 self.references[k] = ray.put(v) 第172话 173

/usr/local/lib/python3.7/dist-packages/ray/_private/client_mode_hook.py 在包装器中(*args,**kwargs) 45 如果 client_mode_should_convert(): 46 return getattr(ray,func.name)(*args,**kwargs) ---> 47 返回 func(*args,**kwargs) 48 49 返回包装器

/usr/local/lib/python3.7/dist-packages/ray/worker.py in put(value)
1512 与 profiling.profile("ray.put"): 1513 尝试: -> 1514 object_ref = worker.put_object(value) 1515 除了 ObjectStoreFullError: 1516 logger.info(

/usr/local/lib/python3.7/dist-packages/ray/worker.py 中 put_object(自我,价值,object_ref) 第 259 章 260 --> 261 serialized_value = self.get_serialization_context().serialize(value) 262 # 这必须是我们构造这个python的第一个地方 263 # ObjectRef 因为在

时创建了一个具有 0 个本地引用的条目

/usr/local/lib/python3.7/dist-packages/ray/serialization.py 中 序列化(自我,价值) 第322话 323 其他: --> 324 返回 self._serialize_to_msgpack(value)

/usr/local/lib/python3.7/dist-packages/ray/serialization.py 中 _serialize_to_msgpack(self,value) 302 元数据 = ray_constants.OBJECT_MetaDATA_TYPE_PYTHON 第303话 --> 304 self._serialize_to_pickle5(元数据,python_objects) 305 其他: 306 pickle5_serialized_object = 无

/usr/local/lib/python3.7/dist-packages/ray/serialization.py 中 _serialize_to_pickle5(自我,元数据,值) 262 除了作为 e 的例外: 第263话 --> 264 提高 e 265终于: 第266话

/usr/local/lib/python3.7/dist-packages/ray/serialization.py 中 _serialize_to_pickle5(自我,元数据,值) 第259话 260带内=pickle.dumps( --> 261 值,协议=5,buffer_callback=writer.buffer_callback) 262 除了作为 e 的例外: 第263话

/usr/local/lib/python3.7/dist-packages/ray/cloudpickle/cloudpickle_fast.py 在转储(obj,协议,buffer_callback) 71 文件,协议=协议,buffer_callback=buffer_callback 72) ---> 73 cp.dump(obj) 74 返回 file.getvalue() 75

/usr/local/lib/python3.7/dist-packages/ray/cloudpickle/cloudpickle_fast.py 在转储(自我,对象) 第578话 第579话 --> 580 返回 Pickler.dump(self,obj) 581 除了 RuntimeError 作为 e: 第582回

/usr/local/lib/python3.7/dist-packages/pyarrow/io.pxi 中 pyarrow.lib.Buffer.reduce_ex()

属性错误:模块“pickle”没有属性“PickleBuffer”

我的环境设置:

  • 正在使用 Google Colab
  • 平台:Linux-5.4.109+-x86_64-with-ubuntu-18.04-bionic
  • Python 版本:3.7.10
  • 变形金刚版本:4.6.1
  • 射线版本:1.3.0

我尝试过的:

  • 更新泡菜
  • 安装并导入pickle5作为pickle
  • 确保我的直接目录中没有名为“pickle”的 python 文件

这个错误来自哪里,我该如何解决

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。