สร้างแพ็กเกจ TensorFlow ด้วย pip จากซอร์สโค้ด แล้วติดตั้งบน Windows
การติดตั้งสำหรับ Windows
ติดตั้งเครื่องมือสร้างต่อไปนี้เพื่อกำหนดค่าสภาพแวดล้อมการพัฒนา Windows ของคุณ
ติดตั้ง Python และแพ็คเกจที่จำเป็นของ TensorFlow
ติดตั้ง Python 3.9 เวอร์ชัน 64 บิตขึ้นไปสำหรับ Windows เลือก pip เป็นฟีเจอร์เสริม และเพิ่มลงในตัวแปรสภาพแวดล้อม %PATH% ของคุณ
ติดตั้งแพ็คเกจ pip ที่จำเป็นสำหรับ TensorFlow:
pip3 install -U pippip3 install -U six numpy wheel packagingpip3 install -U keras_preprocessing --no-deps
รายการแพ็คเกจที่จำเป็นจะระบุไว้ในไฟล์ setup.py ในส่วน REQUIRED_PACKAGES
ติดตั้ง Bazel
ติดตั้ง Bazel ซึ่งเป็นเครื่องมือสร้างโปรแกรมที่ใช้ในการคอมไพล์ TensorFlow สำหรับเวอร์ชันของ Bazel โปรดดู การกำหนดค่าการสร้างโปรแกรมที่ผ่านการทดสอบแล้ว สำหรับ Windows กำหนดค่า Bazel ให้ สร้างโปรแกรมด้วยภาษา C++
เพิ่มตำแหน่งที่ตั้งของไฟล์ปฏิบัติการ Bazel ลงในตัวแปรสภาพแวดล้อม %PATH% ของคุณ
ติดตั้ง MSYS2
ติดตั้ง MSYS2 เพื่อรับเครื่องมือไบนารีที่จำเป็นสำหรับการสร้าง TensorFlow หากติดตั้ง MSYS2 ไว้ที่ C:\msys64 ให้เพิ่ม C:\msys64\usr\bin ลงในตัวแปรสภาพแวดล้อม %PATH% ของคุณ จากนั้นใช้ cmd.exe เรียกใช้คำสั่ง:
pacman -Syu (requires a console restart) pacman -S git patch unzip pacman -S git patch unzip rsync
ติดตั้ง Visual C++ Build Tools 2022
ติดตั้ง Visual C++ build tools 2022 ซึ่งมาพร้อมกับ Visual Studio Community 2022 แต่สามารถติดตั้งแยกต่างหากได้:
- ไปที่หน้า ดาวน์โหลด Visual Studio
- เลือก เครื่องมือสำหรับ Visual Studio หรือ เครื่องมือ เฟรมเวิร์ก และไฟล์ที่สามารถแจกจ่ายได้อื่นๆ
- ดาวน์โหลดและติดตั้ง:
- เครื่องมือสร้างสำหรับ Visual Studio 2022
- Microsoft Visual C++ Redistributables สำหรับ Visual Studio 2022
ติดตั้ง LLVM
- ไปที่หน้า ดาวน์โหลด LLVM
- ดาวน์โหลดและติดตั้ง LLVM ที่เข้ากันได้กับ Windows ใน C:/Program Files/LLVM เช่น LLVM-17.0.6-win64.exe
ติดตั้งโปรแกรมรองรับ GPU (ไม่จำเป็น)
โปรดดูคู่มือ การสนับสนุน GPU สำหรับ Windows เพื่อติดตั้งไดรเวอร์และซอฟต์แวร์เพิ่มเติมที่จำเป็นสำหรับการใช้งาน TensorFlow บน GPU
ดาวน์โหลดซอร์สโค้ดของ TensorFlow
ใช้ Git เพื่อโคลน repository ของ TensorFlow ( git ติดตั้งมาพร้อมกับ MSYS2 แล้ว):
git clone https://github.com/tensorflow/tensorflow.gitcd tensorflow
โดยค่าเริ่มต้น repository จะใช้ branch master สำหรับการพัฒนา คุณสามารถเลือก branch release เพื่อสร้าง build ได้เช่นกัน:
git checkout branch_name # r1.9, r1.10, etc.
ตัวเลือกเสริม: การตั้งค่าตัวแปรด้านสิ่งแวดล้อม
เรียกใช้คำสั่งต่อไปนี้ก่อนเรียกใช้คำสั่ง build เพื่อหลีกเลี่ยงปัญหาในการสร้างแพ็กเกจ: (หากได้ตั้งค่าคำสั่งด้านล่างไว้แล้วในระหว่างการติดตั้งแพ็กเกจ โปรดละเว้นคำสั่งเหล่านี้) เรียกใช้ set เพื่อตรวจสอบว่าเส้นทางทั้งหมดได้รับการตั้งค่าอย่างถูกต้องหรือไม่ เรียกใช้คำสั่ง echo %Environmental Variable% เช่น echo %BAZEL_VC% เพื่อตรวจสอบเส้นทางที่ตั้งค่าไว้สำหรับตัวแปรสภาพแวดล้อมเฉพาะ
ปัญหาเกี่ยวกับการตั้งค่าเส้นทาง Python ใน tensorflow:issue#59943 , tensorflow:issue#9436 , tensorflow:issue#60083
set PATH=path/to/python;%PATH% # [e.g. (C:/Python311)] set PATH=path/to/python/Scripts;%PATH% # [e.g. (C:/Python311/Scripts)] set PYTHON_BIN_PATH=path/to/python_virtualenv/Scripts/python.exe set PYTHON_LIB_PATH=path/to/python virtualenv/lib/site-packages set PYTHON_DIRECTORY=path/to/python_virtualenv/Scripts
ปัญหาการตั้งค่าเส้นทาง Bazel/MSVC/CLANG ใน TensorFlow:issue#54578
set BAZEL_SH=C:/msys64/usr/bin/bash.exe set BAZEL_VS=C:/Program Files/Microsoft Visual Studio/2022/BuildTools set BAZEL_VC=C:/Program Files/Microsoft Visual Studio/2022/BuildTools/VC set Bazel_LLVM=C:/Program Files/LLVM (explicitly tell Bazel where LLVM is installed by BAZEL_LLVM, needed while using CLANG) set PATH=C:/Program Files/LLVM/bin;%PATH% (Optional, needed while using CLANG as Compiler)
ตัวเลือกเสริม: กำหนดค่าการสร้าง
การตั้งค่าการสร้าง TensorFlow จะทำผ่านไฟล์ .bazelrc ที่อยู่ในไดเร็กทอรีหลักของ repository สามารถใช้สคริปต์ ./configure หรือ ./configure.py เพื่อปรับการตั้งค่าทั่วไปได้
หากคุณต้องการเปลี่ยนแปลงการตั้งค่า ให้เรียกใช้สคริปต์ ./configure จากไดเร็กทอรีหลักของที่เก็บข้อมูล
python ./configure.py
สคริปต์นี้จะแจ้งให้คุณระบุตำแหน่งของไฟล์ที่จำเป็นสำหรับ TensorFlow และขอตัวเลือกการกำหนดค่าการสร้างเพิ่มเติม (เช่น แฟล็กของคอมไพเลอร์) ต่อไปนี้คือตัวอย่างการเรียกใช้ python ./configure.py (เซสชันของคุณอาจแตกต่างออกไป):
สร้างและติดตั้งแพ็คเกจ pip
การสร้างแพ็กเกจ pip นั้นทำในสองขั้นตอน คำสั่ง bazel build จะสร้างโปรแกรม "package-builder" ขึ้นมา จากนั้นคุณก็เรียกใช้โปรแกรม package-builder เพื่อสร้างแพ็กเกจ
สร้างตัวสร้างแพ็กเกจ
ที่เก็บโค้ด tensorflow:master ได้รับการอัปเดตเป็นเวอร์ชัน 2.x โดยค่าเริ่มต้นแล้ว ติดตั้ง Bazel และใช้ bazel build เพื่อสร้างตัวสร้างแพ็กเกจ TensorFlow
bazel build //tensorflow/tools/pip_package:wheel
ซีพียูเท่านั้น
ใช้ bazel เพื่อสร้างตัวสร้างแพ็กเกจ TensorFlow ที่รองรับเฉพาะ CPU:
สร้างด้วย MSVC
bazel build --config=opt --repo_env=TF_PYTHON_VERSION=3.11 //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu
สร้างด้วย CLANG
ใช้คำสั่ง --config= win_clang เพื่อสร้าง TenorFlow ด้วยคอมไพเลอร์ CLANG:
bazel build --config=win_clang --repo_env=TF_PYTHON_VERSION=3.11 //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu
การรองรับ GPU
วิธีการสร้างแพ็กเกจ TensorFlow ที่รองรับ GPU:
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package
คำสั่งสำหรับล้างแคชของ Bazel เพื่อแก้ไขข้อผิดพลาดที่เกิดจากข้อมูลแคชที่ไม่ถูกต้องหรือล้าสมัย คำสั่ง `bazel clean` พร้อมแฟล็ก `--expunge` จะลบไฟล์อย่างถาวร
bazel clean bazel clean --expunge
ตัวเลือกการสร้าง Bazel
ใช้ตัวเลือกนี้เมื่อทำการสร้างเพื่อหลีกเลี่ยงปัญหาในการสร้างแพ็กเกจ: tensorflow:issue#22390
--define=no_tensorflow_py_deps=true
ดู ข้อมูลอ้างอิงคำสั่งบรรทัดคำสั่ง ของ Bazel สำหรับ ตัวเลือกการสร้าง
การคอมไพล์ TensorFlow จากซอร์สโค้ดอาจใช้ RAM จำนวนมาก หากระบบของคุณมีหน่วยความจำจำกัด ให้จำกัดการใช้ RAM ของ Bazel ด้วยคำสั่ง: --local_ram_resources=2048
หากสร้างโปรแกรมโดยรองรับ GPU ให้เพิ่ม --copt=-nvcc_options=disable-warnings เพื่อระงับข้อความเตือนของ nvcc
สร้างแพ็กเกจ
ในการสร้างแพ็กเกจ pip คุณต้องระบุแฟล็ก --repo_env=WHEEL_NAME โดยแพ็กเกจจะถูกสร้างขึ้นตามชื่อที่ระบุ ตัวอย่างเช่น:
วิธีการสร้างแพ็คเกจ TensorFlow สำหรับ CPU:
bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu
ในการสร้างแพ็กเกจ nightly ให้ตั้ง tf_nightly แทน tensorflow เช่น ในการสร้างแพ็กเกจ nightly สำหรับ CPU:
bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tf_nightly_cpu
ดังนั้น ล้อที่สร้างขึ้นจะตั้งอยู่ที่
bazel-bin/tensorflow/tools/pip_package/wheel_house/
ติดตั้งแพ็กเกจ
ชื่อไฟล์ .whl ที่สร้างขึ้นจะขึ้นอยู่กับเวอร์ชัน TensorFlow และแพลตฟอร์มของคุณ ใช้ pip install เพื่อติดตั้งแพ็กเกจ ตัวอย่างเช่น:
pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
สร้างโดยใช้เชลล์ MSYS
นอกจากนี้ยังสามารถสร้าง TensorFlow โดยใช้ MSYS shell ได้ด้วย ทำการเปลี่ยนแปลงตามที่ระบุไว้ด้านล่าง จากนั้นทำตามคำแนะนำก่อนหน้านี้สำหรับบรรทัดคำสั่งดั้งเดิมของ Windows ( cmd.exe )
ปิดใช้งานการแปลงเส้นทาง MSYS
MSYS จะแปลงอาร์กิวเมนต์ที่มีลักษณะคล้ายพาธแบบ Unix ให้เป็นพาธแบบ Windows โดยอัตโนมัติ และวิธีนี้ใช้ไม่ได้กับ bazel (ป้ายกำกับ //path/to:bin ถือเป็นพาธสัมบูรณ์แบบ Unix เนื่องจากขึ้นต้นด้วยเครื่องหมายทับ)
export MSYS_NO_PATHCONV=1export MSYS2_ARG_CONV_EXCL="*"
กำหนดเส้นทางของคุณ
เพิ่มไดเร็กทอรีการติดตั้ง Bazel และ Python ลงในตัวแปรสภาพแวดล้อม $PATH ของคุณ หาก Bazel ติดตั้งอยู่ที่ C:\tools\bazel.exe และ Python ติดตั้งอยู่ที่ C:\Python\python.exe ให้ตั้ง PATH ของคุณด้วยคำสั่งต่อไปนี้:
# Use Unix-style with ':' as separatorexport PATH="/c/tools:$PATH"export PATH="/c/path/to/Python:$PATH"
เพื่อรองรับการใช้งาน GPU ให้เพิ่มไดเร็กทอรี bin ของ CUDA และ cuDNN ลงใน $PATH ของคุณ:
export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0/bin:$PATH"export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0/extras/CUPTI/libx64:$PATH"export PATH="/c/tools/cuda/bin:$PATH"
การกำหนดค่าการสร้างที่ผ่านการทดสอบ
ซีพียู
| เวอร์ชั่น | เวอร์ชัน Python | คอมไพเลอร์ | เครื่องมือสร้าง |
|---|---|---|---|
| เทนเซอร์โฟลว์-2.21.0 | 3.10-3.13 | CLANG 18.1.4 | บาเซล 7.4.1 |
| เทนเซอร์โฟลว์-2.20.0 | 3.9-3.13 | CLANG 18.1.4 | บาเซล 7.4.1 |
| เทนเซอร์โฟลว์-2.19.0 | 3.9-3.12 | CLANG 18.1.4 | บาเซล 6.5.0 |
| เทนเซอร์โฟลว์-2.18.0 | 3.9-3.12 | CLANG 17.0.6 | บาเซล 6.5.0 |
| เทนเซอร์โฟลว์-2.17.0 | 3.9-3.12 | CLANG 17.0.6 | บาเซล 6.5.0 |
| เทนเซอร์โฟลว์-2.16.1 | 3.9-3.12 | CLANG 17.0.6 | บาเซล 6.5.0 |
| เทนเซอร์โฟลว์-2.15.0 | 3.9-3.11 | เอ็มเอสซีซี 2019 | บาเซล 6.1.0 |
| เทนเซอร์โฟลว์-2.14.0 | 3.9-3.11 | เอ็มเอสซีซี 2019 | บาเซล 6.1.0 |
| เทนเซอร์โฟลว์-2.12.0 | 3.8-3.11 | เอ็มเอสซีซี 2019 | บาเซล 5.3.0 |
| เทนเซอร์โฟลว์-2.11.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 5.3.0 |
| เทนเซอร์โฟลว์-2.10.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 5.1.1 |
| เทนเซอร์โฟลว์-2.9.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 5.0.0 |
| เทนเซอร์โฟลว์-2.8.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 4.2.1 |
| เทนเซอร์โฟลว์-2.7.0 | 3.7-3.9 | เอ็มเอสซีซี 2019 | บาเซล 3.7.2 |
| เทนเซอร์โฟลว์-2.6.0 | 3.6-3.9 | เอ็มเอสซีซี 2019 | บาเซล 3.7.2 |
| เทนเซอร์โฟลว์-2.5.0 | 3.6-3.9 | เอ็มเอสซีซี 2019 | บาเซล 3.7.2 |
| เทนเซอร์โฟลว์-2.4.0 | 3.6-3.8 | เอ็มเอสซีซี 2019 | บาเซล 3.1.0 |
| เทนเซอร์โฟลว์-2.3.0 | 3.5-3.8 | เอ็มเอสซีซี 2019 | บาเซล 3.1.0 |
| เทนเซอร์โฟลว์-2.2.0 | 3.5-3.8 | เอ็มเอสซีซี 2019 | บาเซล 2.0.0 |
| เทนเซอร์โฟลว์-2.1.0 | 3.5-3.7 | เอ็มเอสซีซี 2019 | Bazel 0.27.1-0.29.1 |
| เทนเซอร์โฟลว์-2.0.0 | 3.5-3.7 | เอ็มเอสซีซี 2017 | บาเซล 0.26.1 |
| เทนเซอร์โฟลว์-1.15.0 | 3.5-3.7 | เอ็มเอสซีซี 2017 | บาเซล 0.26.1 |
| เทนเซอร์โฟลว์-1.14.0 | 3.5-3.7 | เอ็มเอสซีซี 2017 | Bazel 0.24.1-0.25.2 |
| เทนเซอร์โฟลว์-1.13.0 | 3.5-3.7 | MSVC 2015 อัปเดต 3 | Bazel 0.19.0-0.21.0 |
| เทนเซอร์โฟลว์-1.12.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | บาเซล 0.15.0 |
| เทนเซอร์โฟลว์-1.11.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | บาเซล 0.15.0 |
| เทนเซอร์โฟลว์-1.10.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.9.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.8.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.7.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.6.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.5.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.4.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.3.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.2.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.1.0 | 3.5 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
| เทนเซอร์โฟลว์-1.0.0 | 3.5 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 |
จีพี
| เวอร์ชั่น | เวอร์ชัน Python | คอมไพเลอร์ | เครื่องมือสร้าง | cuDNN | คูดา |
|---|---|---|---|---|---|
| tensorflow_gpu-2.10.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 5.1.1 | 8.1 | 11.2 |
| tensorflow_gpu-2.9.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 5.0.0 | 8.1 | 11.2 |
| tensorflow_gpu-2.8.0 | 3.7-3.10 | เอ็มเอสซีซี 2019 | บาเซล 4.2.1 | 8.1 | 11.2 |
| tensorflow_gpu-2.7.0 | 3.7-3.9 | เอ็มเอสซีซี 2019 | บาเซล 3.7.2 | 8.1 | 11.2 |
| tensorflow_gpu-2.6.0 | 3.6-3.9 | เอ็มเอสซีซี 2019 | บาเซล 3.7.2 | 8.1 | 11.2 |
| tensorflow_gpu-2.5.0 | 3.6-3.9 | เอ็มเอสซีซี 2019 | บาเซล 3.7.2 | 8.1 | 11.2 |
| tensorflow_gpu-2.4.0 | 3.6-3.8 | เอ็มเอสซีซี 2019 | บาเซล 3.1.0 | 8.0 | 11.0 |
| tensorflow_gpu-2.3.0 | 3.5-3.8 | เอ็มเอสซีซี 2019 | บาเซล 3.1.0 | 7.6 | 10.1 |
| tensorflow_gpu-2.2.0 | 3.5-3.8 | เอ็มเอสซีซี 2019 | บาเซล 2.0.0 | 7.6 | 10.1 |
| tensorflow_gpu-2.1.0 | 3.5-3.7 | เอ็มเอสซีซี 2019 | Bazel 0.27.1-0.29.1 | 7.6 | 10.1 |
| tensorflow_gpu-2.0.0 | 3.5-3.7 | เอ็มเอสซีซี 2017 | บาเซล 0.26.1 | 7.4 | 10 |
| tensorflow_gpu-1.15.0 | 3.5-3.7 | เอ็มเอสซีซี 2017 | บาเซล 0.26.1 | 7.4 | 10 |
| tensorflow_gpu-1.14.0 | 3.5-3.7 | เอ็มเอสซีซี 2017 | Bazel 0.24.1-0.25.2 | 7.4 | 10 |
| tensorflow_gpu-1.13.0 | 3.5-3.7 | MSVC 2015 อัปเดต 3 | Bazel 0.19.0-0.21.0 | 7.4 | 10 |
| tensorflow_gpu-1.12.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | บาเซล 0.15.0 | 7.2 | 9.0 |
| tensorflow_gpu-1.11.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | บาเซล 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.10.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 7 | 9 |
| tensorflow_gpu-1.9.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 7 | 9 |
| tensorflow_gpu-1.8.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 7 | 9 |
| tensorflow_gpu-1.7.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 7 | 9 |
| tensorflow_gpu-1.6.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 7 | 9 |
| tensorflow_gpu-1.5.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 7 | 9 |
| tensorflow_gpu-1.4.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 6 | 8 |
| tensorflow_gpu-1.3.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 6 | 8 |
| tensorflow_gpu-1.2.0 | 3.5-3.6 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 5.1 | 8 |
| tensorflow_gpu-1.1.0 | 3.5 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 5.1 | 8 |
| tensorflow_gpu-1.0.0 | 3.5 | MSVC 2015 อัปเดต 3 | ซีเมค เวอร์ชัน 3.6.3 | 5.1 | 8 |