Slo*_*nik 6 python directory caching fast-ai
我已经浏览了几个小时的网页来找到适合我的解决方案,我相信这可能是一个非常小的问题。
我在启动语言模型的最初步骤中使用 fastai 的句段处理器 (SPProcesor)。
我这些步骤的代码如下所示:
bs = 48
processor = SPProcessor(lang='pl')
data_lm = (TextList.from_csv('', target_corpus, processor=processor)
.split_by_rand_pct(0.1)
.label_for_lm()
.databunch(bs=bs)
)
data_lm.save(data_lm_file)
Run Code Online (Sandbox Code Playgroud)
执行后我得到一个错误,如下所示:
~/x/miniconda3/envs/fastai/lib/python3.6/site-packages/fastai/text/data.py in process(self, ds)
466 self.sp_model,self.sp_vocab = cache_dir/'spm.model',cache_dir/'spm.vocab'
467 if not getattr(self, 'vocab', False):
--> 468 with open(self.sp_vocab, 'r', encoding=self.enc) as f: self.vocab = Vocab([line.split('\t')[0] for line in f.readlines()])
469 if self.n_cpus <= 1: ds.items = self._encode_batch(ds.items)
470 else:
FileNotFoundError: [Errno 2] No such file or directory: 'tmp/spm/spm.vocab'
Run Code Online (Sandbox Code Playgroud)
上面执行的代码的正确结果应该如下:
创建名为“tmp”
的文件夹,包含文件夹“spm”,
其中应放置 2 个文件,分别命名为:spm.vocab 和 spm.model。
相反,“tmp”文件夹与
名为“cache_dir”.vocab 和“cache_dir”.model 的文件一起在我当前目录中创建。
找不到文件夹“spm”。
我找到了一种解决方法。
它包括在“tmp”中手动创建一个“spm”文件夹
,并将上面提到的另外两个文件移动到其中,并将它们的名称更改为 spm.vocab 和 spm.model。
这使我可以继续处理,但我想找到一种方法来跳过
手动移动创建的文件等的必要性。
也许我需要在处理之前传递一些具有特定值的参数(可能是 cache_dir)?
如果您对如何解决该问题有任何想法,请指点我。
我会很感激。
如果我将 fastai/text/data.py 中的代码切换到此提交的早期版本,我会看到类似的错误。然后,如果我应用同一个提交中的更改,一切都会很好地工作。现在,同一文件的最新版本(应该有助于处理带有空格的路径)似乎又引入了另一个错误。
所以问题似乎在于 fastai 试图--model_prefix用引号来给出论证,sentencepiece .SentencePieceTrainer.Train这使得它“行为不端”。
您的一种可能性是(1)更新到较新版本的 fastai(由于较新版本中的另一个错误,这可能没有帮助),或者(2)手动将此处的更改应用到您安装的fastai/text/data.py. 这是一个非常小的变化 - 只需删除该行:
cache_dir = cache_dir/'spm'
Run Code Online (Sandbox Code Playgroud)
并替换
f'--model_prefix="cache_dir" --vocab_size={vocab_sz} --model_type={model_type}']))
Run Code Online (Sandbox Code Playgroud)
与
f"--model_prefix={cache_dir/'spm'} --vocab_size={vocab_sz} --model_type={model_type}"]))
Run Code Online (Sandbox Code Playgroud)
如果您不习惯更新安装的代码,您可以通过train_sentencepiece在代码中编写固定版本来替换现有函数,然后执行与fastai.text.data.train_sentencepiece = my_fixed_train_sentencepiece其他调用之前类似的操作来对模块进行猴子修补。
因此,如果您使用的是较新版本的库,代码可能如下所示:
import fastai
from fastai.core import PathOrStr
from fastai.text.data import ListRules, get_default_size, quotemark, full_char_coverage_langs
from typing import Collection
def train_sentencepiece(texts:Collection[str], path:PathOrStr, pre_rules: ListRules=None, post_rules:ListRules=None,
vocab_sz:int=None, max_vocab_sz:int=30000, model_type:str='unigram', max_sentence_len:int=20480, lang='en',
char_coverage=None, tmp_dir='tmp', enc='utf8'):
"Train a sentencepiece tokenizer on `texts` and save it in `path/tmp_dir`"
from sentencepiece import SentencePieceTrainer
cache_dir = Path(path)/tmp_dir
os.makedirs(cache_dir, exist_ok=True)
if vocab_sz is None: vocab_sz=get_default_size(texts, max_vocab_sz)
raw_text_path = cache_dir / 'all_text.out'
with open(raw_text_path, 'w', encoding=enc) as f: f.write("\n".join(texts))
spec_tokens = ['\u2581'+s for s in defaults.text_spec_tok]
SentencePieceTrainer.Train(" ".join([
f"--input={quotemark}{raw_text_path}{quotemark} --max_sentence_length={max_sentence_len}",
f"--character_coverage={ifnone(char_coverage, 0.99999 if lang in full_char_coverage_langs else 0.9998)}",
f"--unk_id={len(defaults.text_spec_tok)} --pad_id=-1 --bos_id=-1 --eos_id=-1",
f"--user_defined_symbols={','.join(spec_tokens)}",
f"--model_prefix={cache_dir/'spm'} --vocab_size={vocab_sz} --model_type={model_type}"]))
raw_text_path.unlink()
return cache_dir
fastai.text.data.train_sentencepiece = train_sentencepiece
Run Code Online (Sandbox Code Playgroud)
如果您使用的是旧版本,则如下所示:
import fastai
from fastai.core import PathOrStr
from fastai.text.data import ListRules, get_default_size, full_char_coverage_langs
from typing import Collection
def train_sentencepiece(texts:Collection[str], path:PathOrStr, pre_rules: ListRules=None, post_rules:ListRules=None,
vocab_sz:int=None, max_vocab_sz:int=30000, model_type:str='unigram', max_sentence_len:int=20480, lang='en',
char_coverage=None, tmp_dir='tmp', enc='utf8'):
"Train a sentencepiece tokenizer on `texts` and save it in `path/tmp_dir`"
from sentencepiece import SentencePieceTrainer
cache_dir = Path(path)/tmp_dir
os.makedirs(cache_dir, exist_ok=True)
if vocab_sz is None: vocab_sz=get_default_size(texts, max_vocab_sz)
raw_text_path = cache_dir / 'all_text.out'
with open(raw_text_path, 'w', encoding=enc) as f: f.write("\n".join(texts))
spec_tokens = ['\u2581'+s for s in defaults.text_spec_tok]
SentencePieceTrainer.Train(" ".join([
f"--input={raw_text_path} --max_sentence_length={max_sentence_len}",
f"--character_coverage={ifnone(char_coverage, 0.99999 if lang in full_char_coverage_langs else 0.9998)}",
f"--unk_id={len(defaults.text_spec_tok)} --pad_id=-1 --bos_id=-1 --eos_id=-1",
f"--user_defined_symbols={','.join(spec_tokens)}",
f"--model_prefix={cache_dir/'spm'} --vocab_size={vocab_sz} --model_type={model_type}"]))
raw_text_path.unlink()
return cache_dir
fastai.text.data.train_sentencepiece = train_sentencepiece
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |