diff --git a/l/llama.cpp/LICENSE b/l/llama.cpp/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/l/llama.cpp/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/l/llama.cpp/build_info.json b/l/llama.cpp/build_info.json new file mode 100644 index 0000000000..44953fbbad --- /dev/null +++ b/l/llama.cpp/build_info.json @@ -0,0 +1,20 @@ +{ + "maintainer": "shalinib-ibm", + "package_name": "llama.cpp", + "github_url": "https://github.com/ggml-org/llama.cpp", + "default_branch": "master", + "package_dir": "l/llama.cpp", + "version": "latest", + "wheel_build": true, + "docker_build": true, + "validate_build_script": true, + "dir" : "latest" + "build_script": "llama_cpp_ubi_9.6.sh", + + "base_docker_image": "registry.access.redhat.com/ubi9/ubi:9.6", + "base_docker_variant": "redhat", + + "docker_cmd": "docker build -t ${package_name}:latest ${dir}", + + "use_non_root_user": false +} diff --git a/l/llama.cpp/llama_cpp_ubi_9.6.sh b/l/llama.cpp/llama_cpp_ubi_9.6.sh new file mode 100644 index 0000000000..3dbb095257 --- /dev/null +++ b/l/llama.cpp/llama_cpp_ubi_9.6.sh @@ -0,0 +1,177 @@ +#!/bin/bash +# ----------------------------------------------------------------------------- +# +# Package : llama.cpp +# Version : latest ( HEAD from master branch) +# Source repo : https://github.com/ggml-org/llama.cpp +# Tested on : UBI:9.6 +# Language : C, C++ +# Ci-Check : True +# Script License : Apache License, Version 2 or later +# Maintainer : Shalini Salomi Bodapati +# +# Disclaimer: This script has been tested in root mode on given +# ========== platform using the mentioned version of the package. +# It may not work as expected with newer versions of the +# package and/or distribution. In such case, please +# contact "Maintainer" of this script. +# +# ----------------------------------------------------------------------------- + +set -e + +# Variables +PACKAGE_NAME=llama.cpp +PACKAGE_URL=https://github.com/ggml-org/llama.cpp +PACKAGE_VERSION=master +CURRENT_DIR=$(pwd) +PACKAGE_DIR=llama.cpp +SCRIPT_PATH=$(dirname $(realpath $0)) + +echo "------------------------Installing dependencies-------------------" + +# install core dependencies +yum install -y python python-pip python-devel gcc-toolset-13 gcc-toolset-13-binutils gcc-toolset-13-binutils-devel gcc-toolset-13-gcc-c++ git make cmake binutils wget patch + +python -m pip install --upgrade pip setuptools wheel build + +export PATH=/opt/rh/gcc-toolset-13/root/usr/bin:$PATH +export LD_LIBRARY_PATH=/opt/rh/gcc-toolset-13/root/usr/lib64:$LD_LIBRARY_PATH +gcc --version + +echo "**** Checking GCC version..." +gcc -v || true + +# ----------------------------------------------------------------------------- +# Clone latest llama.cpp +# ----------------------------------------------------------------------------- + +echo "**** Cloning Ollama repository..." +git clone $PACKAGE_URL +cd $PACKAGE_NAME +git checkout $PACKAGE_VERSION + +# ----------------------------------------------------------------------------- +# Build llama.cpp +# ----------------------------------------------------------------------------- +echo "**** Building Ollama with CMake..." +cmake -B build_llama +cmake --build build_llama -j$(nproc) +if ! cmake --build build_llama -j$(nproc); then + echo "------------------$PACKAGE_NAME:Build_fails-------------------------------------" + exit 1 +fi + + +# ----------------------------------------------------------------------------- +# Auto-generate setup.py and minimal package structure for wheel build +# ----------------------------------------------------------------------------- +echo "**** Creating setup.py and package files ****" + +PKG_NAME="llama_cpp_python_package" +mkdir -p ${PKG_NAME} ${PKG_NAME}/bin ${PKG_NAME}/lib + +BUILD_DIR = os.path.join(os.getcwd(), "build_llama", "bin") + +BINARIES = [ + "llama-cli", + "llama-server", + "llama-bench", + "llama-batched-bench", +] + +LIBRARIES = [ + "libllama-bench-impl.so", + "libllama-common.so.0", + "libllama.so.0", + "libggml.so.0", + "libggml-cpu.so.0", + "libggml-base.so.0", +] + +# Generate setup.py +cat < setup.py +from setuptools import setup, find_packages +from setuptools.command.build_py import build_py +import os, shutil, stat + +PYTHON_PACKAGE_NAME = "llama_cpp_python_package" +VERSION = "master" + +PKG_BIN_DIR = os.path.join(PYTHON_PACKAGE_NAME, "bin") +PKG_LIB_DIR = os.path.join(PYTHON_PACKAGE_NAME, "lib") + +def make_executable(path): + st = os.stat(path) + os.chmod(path, st.st_mode | stat.S_IEXEC) + +class CustomBuild(build_py): + def run(self): + os.makedirs(PKG_BIN_DIR, exist_ok=True) + os.makedirs(PKG_LIB_DIR, exist_ok=True) + + # Copy ollama binary + if os.path.exists(BIN_SRC): + print(f"Copying binaries to {PKG_BIN_DIR}") + for binary in BINARIES: + src = os.path.join(BUILD_DIR, binary) + + if not os.path.exists(src): + print(f"Warning: {src} not found") + continue + + dst = os.path.join(PKG_BIN_DIR, binary) + shutil.copy2(src, dst) + make_executable(dst) + else: + print("Warning: llama.cpp binaries not found") + + # Copy .so libraries + if os.path.exists(LIB_SRC): + for lib in LIBRARIES: + src = os.path.join(BUILD_DIR, lib) + + if os.path.exists(src): + shutil.copy2(src, os.path.join(PKG_LIB_DIR, lib)) + else: + print(f"Warning: {lib} not found") + + super().run() + +setup( + name=PYTHON_PACKAGE_NAME, + version="master", + author="Shalini Salomi Bodapati", + author_email="Shalini.Salomi.Bodapati@ibm.com", + description="llama.cpp binaries + shared libs as Python package", + license="MIT", + packages=find_packages(include=["llama_cpp_python_package"]), + include_package_data=False, + cmdclass={'build_py': CustomBuild}, + package_data={PYTHON_PACKAGE_NAME: ["bin/*", "lib/*.so"]}, + python_requires=">=3.8", +) +EOF + +# Create __init__.py (wrapper) +cat <<'EOF' > ${PKG_NAME}/__init__.py +import subprocess +from pathlib import Path + +def run(args=None): + """Run llama-cli packaged with this wheel.""" + bin_path = Path(__file__).parent / "bin" / "llama-cli" + if not bin_path.exists(): + raise FileNotFoundError("llama-cli binary not found.") + subprocess.run([str(bin_path)] + (args or [])) +EOF + +echo "=============== Building wheel ==================" +python -m pip install --upgrade pip setuptools wheel build + +if ! python setup.py bdist_wheel --plat-name linux_ppc64le --dist-dir "$CURRENT_DIR/"; then + echo "============ Wheel Creation Failed =================" + EXIT_CODE=1 +else + echo "============ Wheel successfully built =================" +fi