diff --git a/.github/workflows/basic-tests-linux-uv.yml b/.github/workflows/basic-tests-linux-uv.yml
index 6fd292a..4b43190 100644
--- a/.github/workflows/basic-tests-linux-uv.yml
+++ b/.github/workflows/basic-tests-linux-uv.yml
@@ -33,14 +33,13 @@ jobs:
- name: Set up Python (uv)
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.13"
- name: Install uv and dependencies
shell: bash
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
+ uv sync --dev --python=3.10 # tests for backwards compatibility
uv pip install -r ch05/07_gpt_to_llama/tests/test-requirements-extra.txt
uv add pytest-ruff nbval
diff --git a/.github/workflows/basic-tests-macos-uv.yml b/.github/workflows/basic-tests-macos-uv.yml
index ecbb6c9..e4cbf42 100644
--- a/.github/workflows/basic-tests-macos-uv.yml
+++ b/.github/workflows/basic-tests-macos-uv.yml
@@ -33,14 +33,13 @@ jobs:
- name: Set up Python (uv)
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.13"
- name: Install uv and dependencies
shell: bash
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
+ uv sync --dev --python=3.10 # tests for backwards compatibility
uv pip install -r ch05/07_gpt_to_llama/tests/test-requirements-extra.txt
uv add pytest-ruff nbval
diff --git a/.github/workflows/basic-tests-old-pytorch.yml b/.github/workflows/basic-tests-old-pytorch.yml
index 116db3c..0bb0ac0 100644
--- a/.github/workflows/basic-tests-old-pytorch.yml
+++ b/.github/workflows/basic-tests-old-pytorch.yml
@@ -31,13 +31,12 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.13"
- name: Install dependencies
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
+ uv sync --dev --python=3.10 # tests for backwards compatibility
uv pip install -r ch05/07_gpt_to_llama/tests/test-requirements-extra.txt
uv add torch==${{ matrix.pytorch-version }}
uv add pytest-ruff nbval
diff --git a/.github/workflows/basic-tests-pip.yml b/.github/workflows/basic-tests-pip.yml
index 504690f..01784d4 100644
--- a/.github/workflows/basic-tests-pip.yml
+++ b/.github/workflows/basic-tests-pip.yml
@@ -33,7 +33,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.10" # tests for backwards compatibility
- name: Create Virtual Environment and Install Dependencies
run: |
diff --git a/.github/workflows/basic-tests-pytorch-rc.yml b/.github/workflows/basic-tests-pytorch-rc.yml
index 742bb23..4e8da01 100644
--- a/.github/workflows/basic-tests-pytorch-rc.yml
+++ b/.github/workflows/basic-tests-pytorch-rc.yml
@@ -27,13 +27,12 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: "3.13"
- name: Install dependencies
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
+ uv sync --dev --python=3.10 # tests for backwards compatibility
uv pip install -r ch05/07_gpt_to_llama/tests/test-requirements-extra.txt
uv add pytest-ruff nbval
uv pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
diff --git a/.github/workflows/basic-tests-windows-uv-pip.yml.disabled b/.github/workflows/basic-tests-windows-uv-pip.yml.disabled
new file mode 100644
index 0000000..4aa7bc5
--- /dev/null
+++ b/.github/workflows/basic-tests-windows-uv-pip.yml.disabled
@@ -0,0 +1,66 @@
+name: Code tests Windows (uv/pip)
+
+on:
+ push:
+ branches: [ main ]
+ paths:
+ - '**/*.py'
+ - '**/*.ipynb'
+ - '**/*.yaml'
+ - '**/*.yml'
+ - '**/*.sh'
+ pull_request:
+ branches: [ main ]
+ paths:
+ - '**/*.py'
+ - '**/*.ipynb'
+ - '**/*.yaml'
+ - '**/*.yml'
+ - '**/*.sh'
+
+jobs:
+ test:
+ runs-on: windows-latest
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.13"
+
+ - name: Install dependencies
+ shell: pwsh
+ run: |
+ $env:Path = "C:\Users\runneradmin\.local\bin;$env:Path"
+ python -m pip install --upgrade pip
+ python -m pip install uv
+ uv venv --python=python3.11
+ . .\.venv\Scripts\Activate.ps1
+ $env:UV_PIP_OPTS="--no-binary tensorflow-io-gcs-filesystem"
+ uv pip install -r requirements.txt
+ uv pip install -r ch05/07_gpt_to_llama/tests/test-requirements-extra.txt
+ uv pip install pytest-ruff nbval
+ uv pip install --force-reinstall matplotlib "numpy<2.1"
+
+ - name: Run Python Tests
+ shell: pwsh
+ run: |
+ $env:Path = "C:\Users\runneradmin\.local\bin;$env:Path"
+ . .\.venv\Scripts\Activate.ps1
+ pytest --ruff setup/02_installing-python-libraries/tests.py
+ pytest --ruff ch04/01_main-chapter-code/tests.py
+ pytest --ruff ch05/01_main-chapter-code/tests.py
+ pytest --ruff ch05/07_gpt_to_llama/tests/tests.py
+ pytest --ruff ch06/01_main-chapter-code/tests.py
+
+ - name: Run Jupyter Notebook Tests
+ shell: pwsh
+ run: |
+ $env:Path = "C:\Users\runneradmin\.local\bin;$env:Path"
+ . .\.venv\Scripts\Activate.ps1
+ pytest --ruff --nbval ch02/01_main-chapter-code/dataloader.ipynb
+ pytest --ruff --nbval ch03/01_main-chapter-code/multihead-attention.ipynb
+ pytest --ruff --nbval ch02/04_bonus_dataloader-intuition/dataloader-intuition.ipynb
diff --git a/.github/workflows/basic-tests-windows-uv.yml.disabled b/.github/workflows/basic-tests-windows-uv.yml.disabled
new file mode 100644
index 0000000..306690a
--- /dev/null
+++ b/.github/workflows/basic-tests-windows-uv.yml.disabled
@@ -0,0 +1,63 @@
+name: Code tests Windows (uv)
+
+on:
+ push:
+ branches: [ main ]
+ paths:
+ - '**/*.py'
+ - '**/*.ipynb'
+ - '**/*.yaml'
+ - '**/*.yml'
+ - '**/*.sh'
+ pull_request:
+ branches: [ main ]
+ paths:
+ - '**/*.py'
+ - '**/*.ipynb'
+ - '**/*.yaml'
+ - '**/*.yml'
+ - '**/*.sh'
+
+jobs:
+ test:
+ runs-on: windows-latest
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.13"
+
+ - name: Install dependencies
+ shell: pwsh
+ run: |
+ # Prepend local bin directory to PATH
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
+ $env:Path = "C:\Users\runneradmin\.local\bin;$env:Path"
+ uv sync --dev --python=3.10
+ $env:UV_PIP_OPTS="--no-binary tensorflow-io-gcs-filesystem"
+ uv pip install -r requirements.txt
+ uv pip install matplotlib # for some reason Windows requires this
+ uv pip install -r ch05/07_gpt_to_llama/tests/test-requirements-extra.txt
+ uv add pytest-ruff nbval
+
+ - name: Run Python Tests
+ shell: pwsh
+ run: |
+ . .\.venv\Scripts\Activate.ps1
+ pytest --ruff setup/02_installing-python-libraries/tests.py
+ pytest --ruff ch04/01_main-chapter-code/tests.py
+ pytest --ruff ch05/01_main-chapter-code/tests.py
+ pytest --ruff ch05/07_gpt_to_llama/tests/tests.py
+ pytest --ruff ch06/01_main-chapter-code/tests.py
+
+ - name: Run Jupyter Notebook Tests
+ shell: pwsh
+ run: |
+ . .\.venv\Scripts\Activate.ps1
+ pytest --ruff --nbval ch02/01_main-chapter-code/dataloader.ipynb
+ pytest --ruff --nbval ch03/01_main-chapter-code/multihead-attention.ipynb
+ pytest --ruff --nbval ch02/04_bonus_dataloader-intuition/dataloader-intuition.ipynb
diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml
index 52e41d6..1764532 100644
--- a/.github/workflows/check-links.yml
+++ b/.github/workflows/check-links.yml
@@ -18,13 +18,11 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: '3.11'
+ python-version: "3.10"
- name: Install dependencies
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
uv add pytest-ruff pytest-check-links
# Current version of retry doesn't work well if there are broken non-URL links
# pip install pytest pytest-check-links pytest-retry
diff --git a/.github/workflows/check-spelling-errors.yml b/.github/workflows/check-spelling-errors.yml
index d347a2e..0fe1949 100644
--- a/.github/workflows/check-spelling-errors.yml
+++ b/.github/workflows/check-spelling-errors.yml
@@ -18,13 +18,12 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: '3.11'
+ python-version: "3.10"
- name: Install codespell
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
+ uv sync --dev --python=3.10
uv add codespell
- name: Run codespell
diff --git a/.github/workflows/pep8-linter.yml b/.github/workflows/pep8-linter.yml
index aa9de7f..8755fd7 100644
--- a/.github/workflows/pep8-linter.yml
+++ b/.github/workflows/pep8-linter.yml
@@ -14,12 +14,11 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: '3.11'
+ python-version: "3.13"
- name: Install ruff (a faster flake 8 equivalent)
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
- uv python install 3.11
- uv add . --dev
+ uv sync --dev --python=3.10
uv add ruff
- name: Run ruff with exceptions
diff --git a/pyproject.toml b/pyproject.toml
index b57d4a2..2c0f3dd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,8 +9,7 @@ dependencies = [
"jupyterlab>=4.0",
"tiktoken>=0.5.1",
"matplotlib>=3.7.1",
- "tensorflow>=2.18.0; sys_platform != \"win32\"",
- "tensorflow-cpu>=2.18.0; sys_platform == \"win32\"",
+ "tensorflow>=2.18.0",
"tqdm>=4.66.1",
"numpy>=1.26,<2.1",
"pandas>=2.2.1",
diff --git a/requirements.txt b/requirements.txt
index 60d486a..ca7d422 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,10 +1,9 @@
-torch >= 2.3.0 # all
-jupyterlab >= 4.0 # all
-tiktoken >= 0.5.1 # ch02; ch04; ch05
-matplotlib >= 3.7.1 # ch04; ch05
-tensorflow>=2.18.0; sys_platform != "win32" # ch05 (non-Windows)
-tensorflow-cpu>=2.18.0; sys_platform == "win32" # ch05 (Windows)
-tqdm >= 4.66.1 # ch05; ch07
-numpy >= 1.26, < 2.1 # dependency of several other libraries like torch and pandas
-pandas >= 2.2.1 # ch06
-psutil >= 5.9.5 # ch07; already installed automatically as dependency of torch
+torch >= 2.3.0 # all
+jupyterlab >= 4.0 # all
+tiktoken >= 0.5.1 # ch02; ch04; ch05
+matplotlib >= 3.7.1 # ch04; ch06; ch07
+tensorflow>=2.18.0 # ch05; ch06; ch07
+tqdm >= 4.66.1 # ch05; ch07
+numpy >= 1.26, < 2.1 # dependency of several other libraries like torch and pandas
+pandas >= 2.2.1 # ch06
+psutil >= 5.9.5 # ch07; already installed automatically as dependency of torch
diff --git a/setup/01_optional-python-setup-preferences/README.md b/setup/01_optional-python-setup-preferences/README.md
index 0128a09..aa90546 100644
--- a/setup/01_optional-python-setup-preferences/README.md
+++ b/setup/01_optional-python-setup-preferences/README.md
@@ -50,7 +50,7 @@ If it returns 3.10 or newer, no further action is required.
> [!NOTE]
-> I recommend installing a Python version that is at least 1-3 versions older than the most recent release to ensure PyTorch compatibility. For example, if the most recent version is Python 3.13, I recommend installing version 3.10, 3.11, or 3.12.
+> I recommend installing a Python version that is at least 2 versions older than the most recent release to ensure PyTorch compatibility. For example, if the most recent version is Python 3.13, I recommend installing version 3.10 or 3.11.
Otherwise, if Python is not installed or is an older version, you can install it for your operating system as described below.
@@ -62,7 +62,7 @@ Otherwise, if Python is not installed or is an older version, you can install it
```bash
sudo apt update
-sudo apt install python3.11 python3.11-venv python3.11-dev
+sudo apt install python3.10 python3.10-venv python3.10-dev
```
@@ -143,13 +143,13 @@ uv pip install packaging
To install all required packages from a `requirements.txt` file (such as the one located at the top level of this GitHub repository) run the following command, assuming the file is in the same directory as your terminal session:
```bash
-uv pip install -U -r requirements.txt
+uv pip install -r requirements.txt
```
Alternatively, install the latest dependencies directly from the repository:
```bash
-uv pip install -U -r https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/refs/heads/main/requirements.txt
+uv pip install -r https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/refs/heads/main/requirements.txt
```
@@ -246,7 +246,7 @@ conda create -n LLMs python=3.10
-> Many scientific computing libraries do not immediately support the newest version of Python. Therefore, when installing PyTorch, it's advisable to use a version of Python that is one to three releases older. For instance, if the latest version of Python is 3.13, using Python 3.10, 3.11, or 3.12 is recommended.
+> Many scientific computing libraries do not immediately support the newest version of Python. Therefore, when installing PyTorch, it's advisable to use a version of Python that is one or two releases older. For instance, if the latest version of Python is 3.13, using Python 3.10 or 3.11 is recommended.
Next, activate your new virtual environment (you have to do it every time you open a new terminal window or tab):
diff --git a/setup/01_optional-python-setup-preferences/native-uv.md b/setup/01_optional-python-setup-preferences/native-uv.md
index ea2acd0..6ea38e8 100644
--- a/setup/01_optional-python-setup-preferences/native-uv.md
+++ b/setup/01_optional-python-setup-preferences/native-uv.md
@@ -70,6 +70,8 @@ uv sync --dev --python 3.11
> If you have problems with the following commands above due to certain dependencies (for example, if you are using Windows), you can always fall back to regular pip:
> `uv add pip`
> `uv run python -m pip install -U -r requirements.txt`
+>
+> Since the TensorFo