diff --git a/gnu/local.mk b/gnu/local.mk
index fd8262de55..61fb2f4816 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1792,7 +1792,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/onionshare-cli-async-mode.patch		\
   %D%/packages/patches/online-judge-tools.patch		\
   %D%/packages/patches/onnx-optimizer-system-library.patch	\
-  %D%/packages/patches/onnx-use-system-googletest.patch	\
   %D%/packages/patches/onnx-1.13.1-use-system-googletest.patch	\
   %D%/packages/patches/onnx-shared-libraries.patch	\
   %D%/packages/patches/onnx-skip-model-downloads.patch		\
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index b1b11b5410..fff7a8c24a 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -28,6 +28,7 @@
 ;;; Copyright © 2024 Timothee Mathieu <timothee.mathieu@inria.fr>
 ;;; Copyright © 2024 Spencer King <spencer.king@geneoscopy.com>
 ;;; Copyright © 2024 David Elsing <david.elsing@posteo.net>
+;;; Copyright © 2024 Andy Tai <atai@atai.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1331,7 +1332,7 @@ (define (delete-ifdefs file)
 (define-public onnx
   (package
     (name "onnx")
-    (version "1.12.0")
+    (version "1.16.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1339,70 +1340,88 @@ (define-public onnx
                     (commit (string-append "v" version))))
               (sha256
                (base32
-                "1g9f1hviksbn7gi6fnd0dsm7nf0w3yia0mjj33d9mggklrl0db6x"))
+                "0f5h204ksfz4ir3qq38ckxja1jfhf1vn5xzwrj83vkkbfjq6fv16"))
               (file-name (git-file-name name version))
-              (patches (search-patches "onnx-use-system-googletest.patch"
-                                       "onnx-shared-libraries.patch"
-                                       "onnx-skip-model-downloads.patch"))
+              (patches (search-patches
+                        "onnx-shared-libraries.patch"
+                        "onnx-skip-model-downloads.patch"))
               (modules '((guix build utils)))
               (snippet '(delete-file-recursively "third_party"))))
-    (build-system python-build-system)
+    (build-system pyproject-build-system)
     (arguments
-     '(#:phases (modify-phases %standard-phases
-                  (add-after 'unpack 'relax-requirements
-                    (lambda _
-                      ;; Does this difference really matter?
-                      (substitute* "requirements.txt"
-                        (("3.20.1") "3.20.2"))))
-                  (add-before 'build 'pass-cmake-arguments
-                    (lambda* (#:key outputs #:allow-other-keys)
-                      ;; Pass options to the CMake-based build process.
-                      (define out
-                        (assoc-ref outputs "out"))
-
-                      (define args
-                        ;; Copy arguments from 'cmake-build-system', plus ask
-                        ;; for shared libraries.
-                        (list "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
-                              (string-append "-DCMAKE_INSTALL_PREFIX=" out)
-                              "-DCMAKE_INSTALL_LIBDIR=lib"
-                              "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE"
-                              (string-append "-DCMAKE_INSTALL_RPATH=" out
-                                             "/lib")
-                              "-DCMAKE_VERBOSE_MAKEFILE=ON"
-
-                              "-DBUILD_SHARED_LIBS=ON"))
-
-                      ;; This environment variable is honored by 'setup.py',
-                      ;; which passes it down to 'cmake'.
-                      (setenv "CMAKE_ARGS" (string-join args))
-
-                      ;; This one is honored by 'setup.py' and passed to 'make
-                      ;; -j'.
-                      (setenv "MAX_JOBS"
-                              (number->string (parallel-job-count)))))
-                  (add-before 'check 'make-test-directory-writable
-                    (lambda _
-                      ;; Make things writable for tests.
-                      (setenv "HOME" (getcwd))
-                      (for-each make-file-writable
-                                (find-files "onnx/examples" "."
-                                            #:directories? #t))))
-                  (add-after 'install 'install-from-cmake
-                    (lambda _
-                      ;; Run "make install" in the build tree 'setup.py'
-                      ;; created for CMake so that libonnx.so,
-                      ;; libonnx_proto.so, etc. are installed.
-                      (invoke "make" "install"
-                              "-C" ".setuptools-cmake-build"))))))
+     (list
+      ;; python-nbval depends transitively on Rust.
+      #:tests?
+      (->bool (member (or (%current-target-system)
+                          (%current-system))
+                      (package-transitive-supported-systems python-nbval)))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'build 'pass-cmake-arguments
+            (lambda* (#:key outputs tests? #:allow-other-keys)
+              ;; For derived package use
+              (substitute* "CMakeLists.txt"
+                (("set\\(ONNX_ROOT.*")
+                 (string-append "set(ONNX_ROOT "#$(package-source this-package) ")\n"))
+                (("\\$\\{ROOT_DIR\\}(/tools.*)" _ rest)
+                 (string-append "${PROJECT_SOURCE_DIR}" rest)))
+              ;; Pass options to the CMake-based build process.
+              (define out
+                (assoc-ref outputs "out"))
+
+              (define args
+                ;; Copy arguments from 'cmake-build-system', plus ask
+                ;; for shared libraries.
+                (list "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
+                      (string-append "-DCMAKE_INSTALL_PREFIX=" out)
+                      "-DCMAKE_INSTALL_LIBDIR=lib"
+                      "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE"
+                      (string-append "-DCMAKE_INSTALL_RPATH=" out
+                                     "/lib")
+                      "-DCMAKE_VERBOSE_MAKEFILE=ON"
+                      (string-append "-DONNX_BUILD_TESTS="
+                                     (if tests? "ON" "OFF"))
+                      "-DBUILD_SHARED_LIBS=ON"
+                      "-DONNX_USE_PROTOBUF_SHARED_LIBS=ON"))
+
+              ;; This environment variable is honored by 'setup.py',
+              ;; which passes it down to 'cmake'.
+              (setenv "CMAKE_ARGS" (string-join args))
+
+              ;; This one is honored by 'setup.py' and passed to 'make
+              ;; -j'.
+              (setenv "MAX_JOBS"
+                      (number->string (parallel-job-count)))))
+          (add-before 'check 'make-test-directory-writable
+            (lambda _
+              ;; Make things writable for tests.
+              (setenv "HOME" (getcwd))
+              (for-each make-file-writable
+                        (find-files "onnx/examples" "."
+                                    #:directories? #t))))
+          (add-after 'install 'install-from-cmake
+            (lambda _
+              ;; Run "make install" in the build tree 'setup.py'
+              ;; created for CMake so that libonnx.so,
+              ;; libonnx_proto.so, etc. are installed.
+              (invoke "make" "install"
+                      "-C" ".setuptools-cmake-build"))))))
     (native-inputs
-     (list cmake
-           googletest
-           pybind11
-           python-coverage
-           python-nbval
-           python-pytest
-           python-pytest-runner))
+     (append
+      (list cmake-minimal
+            googletest
+            pybind11
+            python-coverage
+            python-fb-re2
+            python-parameterized-next
+            python-pytest
+            python-pytest-runner)
+      (filter
+       (lambda (pkg)
+         (member (or (%current-target-system)
+                     (%current-system))
+                 (package-transitive-supported-systems pkg)))
+       (list python-nbval))))
     (inputs
      (list protobuf))
     (propagated-inputs
diff --git a/gnu/packages/patches/onnx-shared-libraries.patch b/gnu/packages/patches/onnx-shared-libraries.patch
index 00583b35da..5a3fd658d0 100644
--- a/gnu/packages/patches/onnx-shared-libraries.patch
+++ b/gnu/packages/patches/onnx-shared-libraries.patch
@@ -1,13 +1,12 @@
-These linker options for the 'onnx_cpp2py_export.cpython-38-*-gnu.so'
-(or similar) extension are meant to be used when building 'libonn.a',
-a static archive.  This patch adapts the link flags to linking with
-'libonnx.so'.
+These linker options for the 'onnx_cpp2py_export.cpython-310-*-gnu.so' (or
+similar) extension are meant to be used when building 'libonn.a', a static
+archive.  This patch adapts the link flags to linking with 'libonnx.so'.
 
 diff --git a/CMakeLists.txt b/CMakeLists.txt
-index cede3073..52f846ed 100644
+index b666eec4..1525b219 100644
 --- a/CMakeLists.txt
 +++ b/CMakeLists.txt
-@@ -475,11 +475,10 @@ if(BUILD_ONNX_PYTHON)
+@@ -585,16 +585,15 @@ if(BUILD_ONNX_PYTHON)
                            PRIVATE $<TARGET_OBJECTS:onnx>)
    else()
      # Assume everything else is like gcc
@@ -15,10 +14,15 @@ index cede3073..52f846ed 100644
 -                          PRIVATE "-Wl,--whole-archive" $<TARGET_FILE:onnx>
 -                                  "-Wl,--no-whole-archive")
 +    target_link_libraries(onnx_cpp2py_export PRIVATE onnx)
+     # Prevent "undefined symbol: _ZNSt10filesystem7__cxx114path14_M_split_cmptsEv" 
+     # (std::filesystem::__cxx11::path::_M_split_cmpts()) on gcc 8
+     if (CMAKE_CXX_STANDARD EQUAL 17 AND CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
+       target_link_libraries(onnx_cpp2py_export PRIVATE "-lstdc++fs")
+     endif()
      set_target_properties(onnx_cpp2py_export
 -                          PROPERTIES LINK_FLAGS "-Wl,--exclude-libs,ALL")
 +                          PROPERTIES LINK_FLAGS
-+			  "-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib")
++                          "-Wl,-rpath=${CMAKE_INSTALL_PREFIX}/lib")
    endif()
  
    target_link_libraries(onnx_cpp2py_export PRIVATE onnx)
diff --git a/gnu/packages/patches/onnx-skip-model-downloads.patch b/gnu/packages/patches/onnx-skip-model-downloads.patch
index 4ab55b4ceb..55925a3ebf 100644
--- a/gnu/packages/patches/onnx-skip-model-downloads.patch
+++ b/gnu/packages/patches/onnx-skip-model-downloads.patch
@@ -1,16 +1,14 @@
-A few tests require downloading models from URLs such as
- <https://s3.amazonaws.com/download.onnx/models/opset_9/zfnet512.tar.gz>.
-Skip those.
+A few tests require downloading models. Skip those.
 
 diff --git a/onnx/backend/test/runner/__init__.py b/onnx/backend/test/runner/__init__.py
-index 049ed57b..f236f1bf 100644
+index 5b60e7c0..838c7ba5 100644
 --- a/onnx/backend/test/runner/__init__.py
 +++ b/onnx/backend/test/runner/__init__.py
-@@ -202,6 +202,7 @@ class Runner(object):
-             print('Start downloading model {} from {}'.format(
-                 model_test.model_name,
-                 model_test.url))
+@@ -236,6 +236,7 @@ class Runner:
+             print(
+                 f"Start downloading model {model_test.model_name} from {model_test.url}"
+             )
 +            raise unittest.SkipTest('Skipping download')
              urlretrieve(model_test.url, download_file.name)
-             print('Done')
+             print("Done")
              with tarfile.open(download_file.name) as t:
diff --git a/gnu/packages/patches/onnx-use-system-googletest.patch b/gnu/packages/patches/onnx-use-system-googletest.patch
deleted file mode 100644
index 5dfcbc6dc3..0000000000
--- a/gnu/packages/patches/onnx-use-system-googletest.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-ONNX will build googletest from a Git checkout.  Patch CMake to use our
-googletest package and enable tests by default.
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 0aa9fda2..a573170c 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -22,7 +22,7 @@ option(BUILD_ONNX_PYTHON "Build Python binaries" OFF)
- option(ONNX_GEN_PB_TYPE_STUBS "Generate protobuf python type stubs" ON)
- option(ONNX_WERROR "Build with Werror" OFF)
- option(ONNX_COVERAGE "Build with coverage instrumentation" OFF)
--option(ONNX_BUILD_TESTS "Build ONNX C++ APIs Tests" OFF)
-+option(ONNX_BUILD_TESTS "Build ONNX C++ APIs Tests" ON)
- option(ONNX_USE_LITE_PROTO "Use lite protobuf instead of full." OFF)
- option(ONNXIFI_ENABLE_EXT "Enable onnxifi extensions." OFF)
- if(NOT DEFINED ONNX_ML)
-@@ -82,8 +82,10 @@ if(CMAKE_SYSTEM_NAME STREQUAL "AIX")
- endif()
-
- if(ONNX_BUILD_TESTS)
--  list(APPEND CMAKE_MODULE_PATH ${ONNX_ROOT}/cmake/external)
--  include(googletest)
-+  find_package(GTest REQUIRED)
-+  if(NOT GTest_FOUND)
-+    message(FATAL_ERROR "cannot find googletest")
-+  endif()
- endif()
-
- if((ONNX_USE_LITE_PROTO AND TARGET protobuf::libprotobuf-lite) OR ((NOT ONNX_USE_LITE_PROTO) AND TARGET protobuf::libprotobuf))
-diff --git a/cmake/unittest.cmake b/cmake/unittest.cmake
-index e29a93ff..ae146390 100644
---- a/cmake/unittest.cmake
-+++ b/cmake/unittest.cmake
-@@ -6,8 +6,8 @@ include(${ONNX_ROOT}/cmake/Utils.cmake)
-
- find_package(Threads)
-
--set(${UT_NAME}_libs ${googletest_STATIC_LIBRARIES})
--set(${ONNXIFI_TEST_DRIVER}_libs ${googletest_STATIC_LIBRARIES})
-+set(${UT_NAME}_libs ${GTEST_LIBRARIES})
-+set(${ONNXIFI_TEST_DRIVER}_libs ${GTEST_LIBRARIES})
-
- list(APPEND ${UT_NAME}_libs onnx)
- list(APPEND ${UT_NAME}_libs onnx_proto)
-@@ -31,10 +31,10 @@ function(AddTest)
-   list(REMOVE_DUPLICATES _UT_SOURCES)
-
-   add_executable(${_UT_TARGET} ${_UT_SOURCES})
--  add_dependencies(${_UT_TARGET} onnx onnx_proto googletest)
-+  add_dependencies(${_UT_TARGET} onnx onnx_proto)
-
-   target_include_directories(${_UT_TARGET}
--                             PUBLIC ${googletest_INCLUDE_DIRS}
-+                             PUBLIC ${GTEST_INCLUDE_DIRS}
-                                     ${ONNX_INCLUDE_DIRS}
-                                     ${PROTOBUF_INCLUDE_DIRS}
-                                     ${ONNX_ROOT}
