解决tiktoken库调用get_encoding时SSL超时

文章目录

  • 解决tiktoken库调用get_encoding时SSL超时
    • [1. 获取词表文件url](#1. 获取词表文件url)
    • [2. 手动下载词表文件并保存到本地](#2. 手动下载词表文件并保存到本地)
    • [3. 复制并重命名文件](#3. 复制并重命名文件)
    • [4. 环境变量中设置tiktoken cache](#4. 环境变量中设置tiktoken cache)
    • [5. 使用tiktoken库](#5. 使用tiktoken库)
    • 参考资料

解决tiktoken库调用get_encoding时SSL超时

最近在看Build a Large Language Model (From Scratch) 这本书。在该书的第二章中,作者尝试使用tiktoken库构建一个tokenizer。然而,当我执行以下代码时,程序报错。

python 复制代码
import tiktoken
tokenizer = tiktoken.get_encoding("gpt2")
shell 复制代码
ConnectTimeout: HTTPSConnectionPool(host='openaipublic.blob.core.windows.net', port=443): Max retries exceeded with url: /encodings/gpt2.tiktoken (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7fd41b819630>, 'Connection to openaipublic.blob.core.windows.net timed out. (connect timeout=None)'))

这个错误的根本原因是构建tokenizer时tiktoken库尝试下载词表文件遇到网络问题而失败。一个可行的解决方案时先手动下载文件到本地,然后让tiktoken直接从本地文件读取数据并构建tokenizer。

1. 获取词表文件url

First, let's grab the tokenizer blob URL from the source on your remote machine. If we trace the get_encoding function, we find it calls a function from tiktoken_ext.openai_public which has the blob URIs for each encoder. Identify the correct function, then print the source

首先需要查看一下构建我们所需的tokenizer需要哪些词表文件。我这里需要使用构建名为gpt2的tokenizer。从下面的输出信息可以看到,还有 o200k_base, p50k_base等可供选择。结果显示,构建gpt2tokenizer需要下载vocab.bpeencoder.json两个文件。

python 复制代码
import tiktoken_ext.openai_public
import inspect

print(dir(tiktoken_ext.openai_public))
# The encoder we want is cl100k_base, we see this as a possible function

print(inspect.getsource(tiktoken_ext.openai_public.gpt2))
# The URL should be in the 'load_tiktoken_bpe function call'

运行结果:

shell 复制代码
['ENCODING_CONSTRUCTORS', 'ENDOFPROMPT', 'ENDOFTEXT', 'FIM_MIDDLE', 'FIM_PREFIX', 'FIM_SUFFIX', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'cl100k_base', 'data_gym_to_mergeable_bpe_ranks', 'gpt2', 'load_tiktoken_bpe', 'o200k_base', 'p50k_base', 'p50k_edit', 'r50k_base']
def gpt2():
    mergeable_ranks = data_gym_to_mergeable_bpe_ranks(
        vocab_bpe_file="https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/vocab.bpe",
        encoder_json_file="https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/encoder.json",
        vocab_bpe_hash="1ce1664773c50f3e0cc8842619a93edc4624525b728b188a9e0be33b7726adc5",
        encoder_json_hash="196139668be63f3b5d6574427317ae82f612a97c5d1cdaf36ed2256dbf636783",
    )
    return {
        "name": "gpt2",
        "explicit_n_vocab": 50257,
        # The pattern in the original GPT-2 release is:
        # r"""'s|'t|'re|'ve|'m|'ll|'d| ?[\p{L}]+| ?[\p{N}]+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+"""
        # This is equivalent, but executes faster:
        "pat_str": r"""'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""",
        "mergeable_ranks": mergeable_ranks,
        "special_tokens": {ENDOFTEXT: 50256},
    }

2. 手动下载词表文件并保存到本地

根据步骤1获得的url,手动下载词表文件并保存到本地。

3. 复制并重命名文件

新建一个文件夹.tiktoken,将下载的词表文件复制至该文件夹。重命名各文件,新的文件值可以通过执行以下代码获取。blobpath是步骤1中获取的该文件对应的url值。

python 复制代码
import hashlib

blobpath = "your_blob_url_here"
cache_key = hashlib.sha1(blobpath.encode()).hexdigest()
print(cache_key)

比如对于我刚刚下载的encoder.json文件,结果如下:

python 复制代码
import hashlib

blobpath = "https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/encoder.json"
cache_key = hashlib.sha1(blobpath.encode()).hexdigest()
print(cache_key)
shell 复制代码
6c7ea1a7e38e3a7f062df639a5b80947f075ffe6

于是将encoder.json重命名为6c7ea1a7e38e3a7f062df639a5b80947f075ffe6(注意,重命名后的文件不带.json后缀)。

4. 环境变量中设置tiktoken cache

执行以下代码,指定tiktoken cache为.titoken文件夹。注意,每次使用tiktoken库时都要运行下述代码。

python 复制代码
import os

tiktoken_cache_dir = "path_to_folder_containing_tiktoken_file"
os.environ["TIKTOKEN_CACHE_DIR"] = tiktoken_cache_dir

# validate
assert os.path.exists(os.path.join(tiktoken_cache_dir, cache_key))

5. 使用tiktoken库

现在应该可以正常使用tiktoken库构建tokenizer。

python 复制代码
encoding = tiktoken.get_encoding("gpt2")
encoding.encode("Hello, world")
shell 复制代码
[15496, 11, 995]

参考资料

[1] SSLError: HTTPSConnectionPool(host='openaipublic.blob.core.windows.net', port=443): Max retries exceeded with url · Issue #281 · openai/tiktoken (github.com)

[2] python - how to use tiktoken in offline mode computer - Stack Overflow

相关推荐
紫雾凌寒38 分钟前
计算机视觉 |解锁视频理解三剑客——TimeSformer
python·深度学习·神经网络·计算机视觉·transformer·timesformer
程序员杰哥1 小时前
测试用例详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
go54631584657 小时前
本地部署 GitHub 上的 Python 人脸识别项目
开发语言·python·github
FreakStudio8 小时前
手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开
python·嵌入式·大学生·面向对象·技术栈·电子diy·电子计算机
tekin8 小时前
基于 Python 开发在线多人游戏服务器案例解析
服务器·python·游戏·在线多人游戏服务器
让学习成为一种生活方式10 小时前
libGL.so.1: cannot open shared object file: No such file or directory-linux022
linux·开发语言·python
java1234_小锋10 小时前
一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用
python·flask·flask3
图书馆钉子户10 小时前
from flask_session import Session 为什么是Session(app)这么用?
python·flask·mybatis
一只蜗牛儿11 小时前
Sherpa-ONNX:说话人识别与语音识别自动开启(VAD)+ Python API 完整指南
人工智能·python·语音识别
结衣结衣.11 小时前
【OpenCV】入门教学
图像处理·人工智能·python·opencv