Ошибка значения: обработчик gopen не определен

#python #deep-learning #pytorch #pypi

Вопрос:

Я новичок в использовании библиотеки webdataset от pytorch. Я создал файлы .tar образца набора данных, присутствующего локально в моей системе, с помощью webdataset.ТарРайтер(). Создание файлов .tar, похоже, прошло успешно, так как я мог бы извлечь их отдельно на платформе Windows и проверить одни и те же файлы набора данных.

Теперь я создаю train_dataset = wds.Dataset(url) , где URL-адрес является локальным путем к файлам .tar. после этого я выполняю следующие операции:

 train_loader = torch.utils.data.DataLoader(train_dataset, num_workers=0, batch_size=10)
sample = next(iter(train_loader))
print(sample)
 

Это приводит меня к такой ошибкевведите описание изображения здесь

Тот же код отлично работает, если я использую пример веб-адреса: "http://storage.googleapis.com/nvdata-openimages/openimages-train-000000.tar" упоминается в документации webdataset: https://reposhub.com/python/deep-learning/tmbdev-webdataset.html

До сих пор я не мог понять причину ошибки. Есть идеи о том, как решить эту проблему?

Ответ №1:

Со вчерашнего дня у меня была та же ошибка, и я наконец нашел виновника. WebDataset/tarIterators.py использует WebDataset/gopen.py. В gopen.py urllib.parse.urlparse вызывается для анализа открываемого URL-адреса, в вашем случае это URL- D:/PhD/... адрес .

 gopen_schemes = dict(
    __default__=gopen_error,
    pipe=gopen_pipe,
    http=gopen_curl,
    https=gopen_curl,
    sftp=gopen_curl,
    ftps=gopen_curl,
    scp=gopen_curl)

def gopen(url, mode="rb", bufsize=8192, **kw):
    """Open the URL. This uses the `gopen_schemes` dispatch table to dispatch based on scheme.
    Support for the following schemes is built-in: pipe, file, http, https, sftp, ftps, scp.
    When no scheme is given the url is treated as a file. You can use the OPEN_VERBOSE argument to get info about files being opened.
    :param url: the source URL
    :param mode: the mode ("rb", "r")
    :param bufsize: the buffer size
    """
    global fallback_gopen
    verbose = int(os.environ.get("GOPEN_VERBOSE", 0))
    if verbose:
        print("GOPEN", url, info, file=sys.stderr)
    assert mode in ["rb", "wb"], mode
    if url == "-":
        if mode == "rb":
            return sys.stdin.buffer
        elif mode == "wb":
            return sys.stdout.buffer
        else:
            raise ValueError(f"unknown mode {mode}")
    pr = urlparse(url)
    if pr.scheme == "":
        bufsize = int(os.environ.get("GOPEN_BUFFER", -1))
        return open(url, mode, buffering=bufsize)
    if pr.scheme == "file":
        bufsize = int(os.environ.get("GOPEN_BUFFER", -1))
        return open(pr.path, mode, buffering=bufsize)
    handler = gopen_schemes["__default__"]
    handler = gopen_schemes.get(pr.scheme, handler)
    return handler(url, mode, bufsize, **kw)
 

Как вы можете видеть в словаре __default__ , функция такова gopen_error . Это функция, возвращающая ошибку, которую вы видите. pr = urlparse(url) на вашем URL-адресе будет сгенерирован URL-адрес, в котором схема ( pr.scheme ) 'd' указана, потому что ваш диск называется D. Однако это должно быть 'file' для того, чтобы функция работала должным образом. Поскольку он не равен «файлу» или любой другой схеме в словаре (http, https, sftp и т. Д.), Будет использоваться функция по умолчанию, которая возвращает ошибку. Я обошел эту проблему, добавив d=gopen_file к gopen_schemes словарь. Я надеюсь, что это поможет вам в дальнейшем временно. Я также рассмотрю эту проблему на странице WebDataset GitHub и буду обновлять эту страницу, если получу более практичное обновление.

Удачи!

Комментарии:

1. Большое спасибо за этот ответ. Конечно, пожалуйста, обновляйте эту страницу, если найдете какое-либо другое решение.

2. Никаких проблем, рад помочь. Вот ссылка на билет на GitHub .