Merge pull request #226 from lzhengning/macOS

Mac os support
This commit is contained in:
Zheng-Ning Liu 2021-06-21 21:05:11 +08:00 committed by GitHub
commit ae2eafd878
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
50 changed files with 453 additions and 154 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
my my
.refresh .refresh
.DS_Store
__pycache__ __pycache__
.ipynb_checkpoints/ .ipynb_checkpoints/
.vscode/ .vscode/

View File

@ -89,7 +89,7 @@ for i,(x,y) in enumerate(get_data(n)):
Jittor框架对环境要求如下: Jittor框架对环境要求如下:
* 操作系统: **Linux**(e.g. Ubuntu/CentOS/Arch) 或 **Windows Subsystem of LinuxWSL** * 操作系统: **Linux**(e.g. Ubuntu/CentOS/Arch), **macOS**x86_64或 **Windows Subsystem of LinuxWSL**
* Python版本 >= 3.7 * Python版本 >= 3.7
* C++编译器 (需要下列至少一个) * C++编译器 (需要下列至少一个)
- g++ >=5.4.0 - g++ >=5.4.0
@ -100,7 +100,9 @@ Jittor框架对环境要求如下:
如果您不希望手动配置环境,我们推荐使用 Docker 进行安装。 如果您不希望手动配置环境,我们推荐使用 Docker 进行安装。
除此之外,您还可以使用 pip 安装和手动安装。 除此之外,您还可以使用 pip 安装和手动安装。
注意目前Jittor通过WSL的方式在Windows操作系统上运行WSL的安装方法请参考[微软官网](https://docs.microsoft.com/en-us/windows/wsl/install-win10)WSL版本目前尚不支持CUDA。 注意1目前Jittor通过WSL的方式在Windows操作系统上运行WSL的安装方法请参考[微软官网](https://docs.microsoft.com/en-us/windows/wsl/install-win10)WSL版本目前尚不支持CUDA。
注意2macOS 用户需要安装额外依赖,请参考 [macOS 安装](#macOS-安装)。
Jittor 提供了三种安装方法dockerpip和手动安装 Jittor 提供了三种安装方法dockerpip和手动安装
@ -112,6 +114,7 @@ Jittor 提供了三种安装方法dockerpip和手动安装
## Docker 安装 ## Docker 安装
我们提供了Docker安装方式免去您配置环境Docker安装方法如下 我们提供了Docker安装方式免去您配置环境Docker安装方法如下
@ -145,6 +148,27 @@ python3.7 -m jittor.test.test_example
如果测试运行通过,恭喜你已经安装完成. 如果测试运行通过,恭喜你已经安装完成.
jittor会自动在路径中寻找合适的编译器, 如果您希望手动指定编译器, 请使用环境变量 `cc_path``nvcc_path`(可选). jittor会自动在路径中寻找合适的编译器, 如果您希望手动指定编译器, 请使用环境变量 `cc_path``nvcc_path`(可选).
## macOS 安装
macOS 请使用 [homebrew](https://brew.sh) 安装额外的依赖 (python>=3.7, onednn)。
```bash
brew install python@3.7 onednn libomp
```
之后您可以通过 pip 安装 jittor并测试是否可以成功运行。
```bash
python3.7 -m pip install jittor
python3.7 -m jittor.test.test_example
```
目前在macOS中jittor 只支持 CPU 计算。
## 手动安装 ## 手动安装

View File

@ -92,9 +92,10 @@ We provide some jupyter notebooks to help you quick start with Jittor.
Jittor environment requirements: Jittor environment requirements:
* System: **Linux**(e.g. Ubuntu/CentOS/Arch) (or **Windows** Subsystem of Linux) * System: **Linux**(e.g. Ubuntu/CentOS/Arch), **macOS**, or **Windows Subsystem of Linux (WSL)**
* Python version >= 3.7 * Python version >= 3.7
* CPU compiler (require at least one of the following) * CPU compiler (require at least one of the following)
* g++ (>=5.4.0) * g++ (>=5.4.0)
@ -105,7 +106,9 @@ Jittor environment requirements:
Note: Currently Jittor runs on the Windows operating system through WSL. For the installation method of WSL, please refer to [Microsoft official website](https://docs.microsoft.com/en-us/windows/wsl/install-win10). WSL does not yet support CUDA. Note#1: Currently Jittor runs on the Windows operating system through WSL. For the installation method of WSL, please refer to [Microsoft official website](https://docs.microsoft.com/en-us/windows/wsl/install-win10). WSL does not yet support CUDA.
Note#2: macOS users have to install additional dependencies, see [macOS install](#macOS-install).
Jittor offers three ways to install: docker, pip, or manual. Jittor offers three ways to install: docker, pip, or manual.
@ -139,6 +142,27 @@ python3.7 -m jittor.test.test_example
``` ```
## macOS install
Please first install additional dependencies with [homebrew](https://brew.sh).
```bash
brew install python@3.7 onednn libomp
```
Then you can install jittor through pip and run the example.
```bash
python3.7 -m pip install jittor
python3.7 -m jittor.test.test_example
```
Currently jittor only supports CPU in macOS.
## manual install ## manual install
We will show how to install Jittor in Ubuntu 16.04 step by step, Other Linux distributions may have similar commands. We will show how to install Jittor in Ubuntu 16.04 step by step, Other Linux distributions may have similar commands.

View File

@ -113,7 +113,7 @@ We provide some jupyter notebooks to help you quick start with Jittor.
Jittor框架对环境要求如下: Jittor框架对环境要求如下:
* 操作系统: **Linux**(e.g. Ubuntu/CentOS/Arch) 或 **Windows Subsystem of LinuxWSL** * 操作系统: **Linux**(e.g. Ubuntu/CentOS/Arch), **macOS**x86_64或 **Windows Subsystem of LinuxWSL**
* Python版本 >= 3.7 * Python版本 >= 3.7
* C++编译器 (需要下列至少一个) * C++编译器 (需要下列至少一个)
- g++ >=5.4.0 - g++ >=5.4.0
@ -124,13 +124,15 @@ Jittor框架对环境要求如下:
如果您不希望手动配置环境,我们推荐使用 Docker 进行安装。 如果您不希望手动配置环境,我们推荐使用 Docker 进行安装。
除此之外,您还可以使用 pip 安装和手动安装。 除此之外,您还可以使用 pip 安装和手动安装。
注意目前Jittor通过WSL的方式在Windows操作系统上运行WSL的安装方法请参考[微软官网](https://docs.microsoft.com/en-us/windows/wsl/install-win10)WSL版本目前尚不支持CUDA。 注意1目前Jittor通过WSL的方式在Windows操作系统上运行WSL的安装方法请参考[微软官网](https://docs.microsoft.com/en-us/windows/wsl/install-win10)WSL版本目前尚不支持CUDA。
注意2macOS 用户需要安装额外依赖,请参考 [macOS 安装](#macOS-安装)。
Jittor 提供了三种安装方法dockerpip和手动安装 Jittor 提供了三种安装方法dockerpip和手动安装
Jittor environment requirements: Jittor environment requirements:
* System: **Linux**(e.g. Ubuntu/CentOS/Arch) (or **Windows** Subsystem of Linux) * System: **Linux**(e.g. Ubuntu/CentOS/Arch), **macOS**, or **Windows Subsystem of Linux (WSL)**
* Python version >= 3.7 * Python version >= 3.7
* CPU compiler (require at least one of the following) * CPU compiler (require at least one of the following)
* g++ (>=5.4.0) * g++ (>=5.4.0)
@ -141,7 +143,9 @@ Jittor environment requirements:
Note: Currently Jittor runs on the Windows operating system through WSL. For the installation method of WSL, please refer to [Microsoft official website](https://docs.microsoft.com/en-us/windows/wsl/install-win10). WSL does not yet support CUDA. Note#1: Currently Jittor runs on the Windows operating system through WSL. For the installation method of WSL, please refer to [Microsoft official website](https://docs.microsoft.com/en-us/windows/wsl/install-win10). WSL does not yet support CUDA.
Note#2: macOS users have to install additional dependencies, see [macOS install](#macOS-install).
Jittor offers three ways to install: docker, pip, or manual. Jittor offers three ways to install: docker, pip, or manual.
@ -183,6 +187,31 @@ python3.7 -m jittor.test.test_example
如果测试运行通过,恭喜你已经安装完成. 如果测试运行通过,恭喜你已经安装完成.
jittor会自动在路径中寻找合适的编译器, 如果您希望手动指定编译器, 请使用环境变量 `cc_path``nvcc_path`(可选). jittor会自动在路径中寻找合适的编译器, 如果您希望手动指定编译器, 请使用环境变量 `cc_path``nvcc_path`(可选).
## macOS 安装
## macOS install
macOS 请使用 [homebrew](https://brew.sh) 安装额外的依赖 (python>=3.7, onednn)。
Please first install additional dependencies with [homebrew](https://brew.sh).
```bash
brew install python@3.7 onednn libomp
```
之后您可以通过 pip 安装 jittor并测试是否可以成功运行。
Then you can install jittor through pip and run the example.
```bash
python3.7 -m pip install jittor
python3.7 -m jittor.test.test_example
```
目前在macOS中jittor 只支持 CPU 计算。
Currently jittor only supports CPU in macOS.
## 手动安装 ## 手动安装
## manual install ## manual install

View File

@ -1169,9 +1169,11 @@ def dirty_fix_pytorch_runtime_error():
jt.dirty_fix_pytorch_runtime_error() jt.dirty_fix_pytorch_runtime_error()
import torch import torch
''' '''
import os import os, platform
os.RTLD_GLOBAL = os.RTLD_GLOBAL | os.RTLD_DEEPBIND
if platform.system() == 'Linux':
os.RTLD_GLOBAL = os.RTLD_GLOBAL | os.RTLD_DEEPBIND
import atexit import atexit

View File

@ -5,6 +5,7 @@
# file 'LICENSE.txt', which is part of this source code package. # file 'LICENSE.txt', which is part of this source code package.
# *************************************************************** # ***************************************************************
import os, sys, shutil import os, sys, shutil
import platform
from .compiler import * from .compiler import *
from jittor_utils import run_cmd, get_version, get_int_version from jittor_utils import run_cmd, get_version, get_int_version
from jittor_utils.misc import download_url_to_local from jittor_utils.misc import download_url_to_local
@ -74,39 +75,49 @@ def setup_mkl():
mkl_include_path = os.environ.get("mkl_include_path") mkl_include_path = os.environ.get("mkl_include_path")
mkl_lib_path = os.environ.get("mkl_lib_path") mkl_lib_path = os.environ.get("mkl_lib_path")
if mkl_lib_path is None or mkl_include_path is None: if platform.system() == 'Linux':
mkl_install_sh = os.path.join(jittor_path, "script", "install_mkl.sh") if mkl_lib_path is None or mkl_include_path is None:
LOG.v("setup mkl...") mkl_install_sh = os.path.join(jittor_path, "script", "install_mkl.sh")
# mkl_path = os.path.join(cache_path, "mkl") LOG.v("setup mkl...")
# mkl_path decouple with cc_path # mkl_path = os.path.join(cache_path, "mkl")
from pathlib import Path # mkl_path decouple with cc_path
mkl_path = os.path.join(str(Path.home()), ".cache", "jittor", "mkl") from pathlib import Path
mkl_path = os.path.join(str(Path.home()), ".cache", "jittor", "mkl")
make_cache_dir(mkl_path)
install_mkl(mkl_path) make_cache_dir(mkl_path)
mkl_home = "" install_mkl(mkl_path)
for name in os.listdir(mkl_path): mkl_home = ""
if name.startswith("dnnl") and os.path.isdir(os.path.join(mkl_path, name)): for name in os.listdir(mkl_path):
mkl_home = os.path.join(mkl_path, name) if name.startswith("dnnl") and os.path.isdir(os.path.join(mkl_path, name)):
break mkl_home = os.path.join(mkl_path, name)
assert mkl_home!="" break
assert mkl_home!=""
mkl_include_path = os.path.join(mkl_home, "include") mkl_include_path = os.path.join(mkl_home, "include")
mkl_lib_path = os.path.join(mkl_home, "lib") mkl_lib_path = os.path.join(mkl_home, "lib")
mkl_lib_name = os.path.join(mkl_lib_path, "libmkldnn.so") mkl_lib_name = os.path.join(mkl_lib_path, "libmkldnn.so")
assert os.path.isdir(mkl_include_path) assert os.path.isdir(mkl_include_path)
assert os.path.isdir(mkl_lib_path) assert os.path.isdir(mkl_lib_path)
assert os.path.isfile(mkl_lib_name) assert os.path.isfile(mkl_lib_name)
LOG.v(f"mkl_include_path: {mkl_include_path}") LOG.v(f"mkl_include_path: {mkl_include_path}")
LOG.v(f"mkl_lib_path: {mkl_lib_path}") LOG.v(f"mkl_lib_path: {mkl_lib_path}")
LOG.v(f"mkl_lib_name: {mkl_lib_name}") LOG.v(f"mkl_lib_name: {mkl_lib_name}")
# We do not link manualy, link in custom ops # We do not link manualy, link in custom ops
# ctypes.CDLL(mkl_lib_name, dlopen_flags) # ctypes.CDLL(mkl_lib_name, dlopen_flags)
extra_flags = f" -I'{mkl_include_path}' -L'{mkl_lib_path}' -lmkldnn -Wl,-rpath='{mkl_lib_path}' "
elif platform.system() == 'Darwin':
mkl_lib_paths = [
"/usr/local/lib/libmkldnn.dylib", # x86_64
"/opt/homebrew/lib/libmkldnn.dylib", # arm64
]
if not any([os.path.exists(lib) for lib in mkl_lib_paths]):
raise RuntimeError("Not found onednn, please install it by the command 'brew install onednn@2.2.3'")
extra_flags = f" -lmkldnn "
mkl_op_dir = os.path.join(jittor_path, "extern", "mkl", "ops") mkl_op_dir = os.path.join(jittor_path, "extern", "mkl", "ops")
mkl_op_files = [os.path.join(mkl_op_dir, name) for name in os.listdir(mkl_op_dir)] mkl_op_files = [os.path.join(mkl_op_dir, name) for name in os.listdir(mkl_op_dir)]
mkl_ops = compile_custom_ops(mkl_op_files, mkl_ops = compile_custom_ops(mkl_op_files, extra_flags=extra_flags)
extra_flags=f" -I'{mkl_include_path}' -L'{mkl_lib_path}' -lmkldnn -Wl,-rpath='{mkl_lib_path}' ")
LOG.vv("Get mkl_ops: "+str(dir(mkl_ops))) LOG.vv("Get mkl_ops: "+str(dir(mkl_ops)))

View File

@ -11,6 +11,7 @@ import sys
import inspect import inspect
import datetime import datetime
import threading import threading
import platform
import ctypes import ctypes
import platform import platform
from ctypes import cdll from ctypes import cdll
@ -94,7 +95,7 @@ def compile(compiler, flags, inputs, output, combind_build=False):
return do_compile(cmd) return do_compile(cmd)
def gen_jit_tests(): def gen_jit_tests():
all_src = run_cmd('find -L src/ | grep "cc$"', jittor_path).splitlines() all_src = run_cmd('find -L src | grep "cc$"', jittor_path).splitlines()
jit_declares = [] jit_declares = []
re_def = re.compile("JIT_TEST\\((.*?)\\)") re_def = re.compile("JIT_TEST\\((.*?)\\)")
names = set() names = set()
@ -144,7 +145,7 @@ def gen_jit_tests():
f.write(jit_src) f.write(jit_src)
def gen_jit_flags(): def gen_jit_flags():
all_src = run_cmd('find -L src/ | grep "cc$"', jittor_path).splitlines() all_src = run_cmd('find -L src | grep "cc$"', jittor_path).splitlines()
jit_declares = [] jit_declares = []
re_def = re.compile("DEFINE_FLAG(_WITH_SETTER)?\\((.*?)\\);", re.DOTALL) re_def = re.compile("DEFINE_FLAG(_WITH_SETTER)?\\((.*?)\\);", re.DOTALL)
@ -593,7 +594,7 @@ def compile_custom_ops(
filenames, filenames,
extra_flags="", extra_flags="",
return_module=False, return_module=False,
dlopen_flags=os.RTLD_GLOBAL | os.RTLD_NOW | os.RTLD_DEEPBIND, dlopen_flags=None,
gen_name_ = ""): gen_name_ = ""):
"""Compile custom ops """Compile custom ops
filenames: path of op source files, filenames must be filenames: path of op source files, filenames must be
@ -603,6 +604,11 @@ def compile_custom_ops(
return_module: return module rather than ops(default: False) return_module: return module rather than ops(default: False)
return: compiled ops return: compiled ops
""" """
if dlopen_flags is None:
dlopen_flags = os.RTLD_GLOBAL | os.RTLD_NOW
if platform.system() == 'Linux':
dlopen_flags |= os.RTLD_DEEPBIND
srcs = {} srcs = {}
headers = {} headers = {}
builds = [] builds = []
@ -701,7 +707,7 @@ def get_full_path_of_executable(name):
def compile_extern(): def compile_extern():
# compile llvm passes # compile llvm passes
if cc_type != "clang": if cc_type != "clang" or platform.system() != 'Linux':
return return
global kernel_opt_flags global kernel_opt_flags
cache_path_llvm = os.path.join(cache_path, "llvm") cache_path_llvm = os.path.join(cache_path, "llvm")
@ -842,11 +848,15 @@ def check_debug_flags():
cc_flags = " " cc_flags = " "
# os.RTLD_NOW | os.RTLD_GLOBAL cause segfault when import torch first # os.RTLD_NOW | os.RTLD_GLOBAL cause segfault when import torch first
import_flags = os.RTLD_NOW | os.RTLD_GLOBAL | os.RTLD_DEEPBIND import_flags = os.RTLD_NOW | os.RTLD_GLOBAL
if platform.system() == 'Linux':
import_flags |= os.RTLD_DEEPBIND
# if cc_type=="icc": # if cc_type=="icc":
# # weird link problem, icc omp library may conflict and cause segfault # # weird link problem, icc omp library may conflict and cause segfault
# import_flags = os.RTLD_NOW | os.RTLD_GLOBAL # import_flags = os.RTLD_NOW | os.RTLD_GLOBAL
dlopen_flags = os.RTLD_NOW | os.RTLD_GLOBAL | os.RTLD_DEEPBIND dlopen_flags = os.RTLD_NOW | os.RTLD_GLOBAL
if platform.system() == 'Linux':
import_flags |= os.RTLD_DEEPBIND
with jit_utils.import_scope(import_flags): with jit_utils.import_scope(import_flags):
jit_utils.try_import_jit_utils_core() jit_utils.try_import_jit_utils_core()
@ -894,14 +904,35 @@ gdb_path = try_find_exe('gdb')
addr2line_path = try_find_exe('addr2line') addr2line_path = try_find_exe('addr2line')
has_pybt = check_pybt(gdb_path, python_path) has_pybt = check_pybt(gdb_path, python_path)
cc_flags += " -Wall -Werror -Wno-unknown-pragmas -std=c++14 -fPIC -march=native " cc_flags += " -Wall -Werror -Wno-unknown-pragmas -std=c++14 -fPIC "
# 1. Arch/CPU specific optimization
if platform.machine() == "x86_64":
cc_flags += " -march=native "
elif platform.machine() == 'arm64' and platform.system() == "Darwin":
cc_flags += " -mcpu=apple-a14 "
cc_flags += " -fdiagnostics-color=always " cc_flags += " -fdiagnostics-color=always "
# 2. Non standard include path
if platform.system() == 'Darwin' and platform.machine() == 'arm64':
cc_flags += " -I/opt/homebrew/include "
# 3. User specified flags
if "cc_flags" in os.environ: if "cc_flags" in os.environ:
cc_flags += os.environ["cc_flags"] + ' ' cc_flags += os.environ["cc_flags"] + ' '
link_flags = " -lstdc++ -ldl -shared " link_flags = " -lstdc++ -ldl -shared "
if platform.system() == 'Darwin':
# TODO: if not using apple clang, there is no need to add -lomp
link_flags += "-undefined dynamic_lookup -lomp "
if platform.machine() == "arm64":
link_flags += " -L/opt/homebrew/lib "
core_link_flags = "" core_link_flags = ""
opt_flags = "" opt_flags = ""
kernel_opt_flags = os.environ.get("kernel_flags", "") + opt_flags + " -fopenmp " kernel_opt_flags = os.environ.get("kernel_flags", "") + opt_flags
if platform.system() == 'Darwin':
# TODO: if not using apple clang, cannot add -Xpreprocessor
kernel_opt_flags = kernel_opt_flags + " -Xpreprocessor -fopenmp "
else:
kernel_opt_flags = kernel_opt_flags + " -fopenmp "
if ' -O' not in cc_flags: if ' -O' not in cc_flags:
opt_flags += " -O2 " opt_flags += " -O2 "
@ -960,7 +991,7 @@ if has_cuda:
# build core # build core
gen_jit_flags() gen_jit_flags()
gen_jit_tests() gen_jit_tests()
op_headers = run_cmd('find -L src/ops/ | grep "op.h$"', jittor_path).splitlines() op_headers = run_cmd('find -L src/ops | grep "op.h$"', jittor_path).splitlines()
jit_src = gen_jit_op_maker(op_headers) jit_src = gen_jit_op_maker(op_headers)
LOG.vvvv(jit_src) LOG.vvvv(jit_src)
with open(os.path.join(cache_path, "gen", "jit_op_maker.h"), 'w') as f: with open(os.path.join(cache_path, "gen", "jit_op_maker.h"), 'w') as f:
@ -1008,19 +1039,26 @@ LOG.vv("compile order:", files)
# manual Link omp using flags(os.RTLD_NOW | os.RTLD_GLOBAL) # manual Link omp using flags(os.RTLD_NOW | os.RTLD_GLOBAL)
# if cc_type=="icc": # if cc_type=="icc":
# os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" # os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
libname = {"clang":"omp", "icc":"iomp5", "g++":"gomp"}[cc_type]
libname = ctypes.util.find_library(libname) if platform.system() == 'Linux':
assert libname is not None, "openmp library not found" libname = {"clang":"omp", "icc":"iomp5", "g++":"gomp"}[cc_type]
ctypes.CDLL(libname, os.RTLD_NOW | os.RTLD_GLOBAL) libname = ctypes.util.find_library(libname)
assert libname is not None, "openmp library not found"
ctypes.CDLL(libname, os.RTLD_NOW | os.RTLD_GLOBAL)
# get os release # get os release
with open("/etc/os-release", "r", encoding='utf8') as f: if platform.system() == 'Linux':
s = f.read().splitlines() with open("/etc/os-release", "r", encoding='utf8') as f:
os_release = {} s = f.read().splitlines()
for line in s: os_release = {}
a = line.split('=') for line in s:
if len(a) != 2: continue a = line.split('=')
os_release[a[0]] = a[1].replace("\"", "") if len(a) != 2: continue
os_release[a[0]] = a[1].replace("\"", "")
os_arch = ''
elif platform.system() == 'Darwin':
os_release = {'ID' : 'macos'}
os_arch = platform.machine()
os_type = { os_type = {
"ubuntu": "ubuntu", "ubuntu": "ubuntu",
@ -1028,7 +1066,9 @@ os_type = {
"centos": "centos", "centos": "centos",
"rhel": "ubuntu", "rhel": "ubuntu",
"fedora": "ubuntu", "fedora": "ubuntu",
"macos": "macos",
} }
version_file = os.path.join(jittor_path, "version") version_file = os.path.join(jittor_path, "version")
if os.path.isfile(version_file) and not os.path.isdir(os.path.join(jittor_path, "src", "__data__")): if os.path.isfile(version_file) and not os.path.isdir(os.path.join(jittor_path, "src", "__data__")):
with open(version_file, 'r') as f: with open(version_file, 'r') as f:
@ -1036,7 +1076,8 @@ if os.path.isfile(version_file) and not os.path.isdir(os.path.join(jittor_path,
# key = f"{version}-{cc_type}-{'cuda' if has_cuda else 'cpu'}.o" # key = f"{version}-{cc_type}-{'cuda' if has_cuda else 'cpu'}.o"
key = f"{version}-g++-cpu" key = f"{version}-g++-cpu"
os_id = os_release["ID"] os_id = os_release["ID"]
os_key = os_type.get(os_id, "ubuntu") os_key = os_type.get(os_id, "ubuntu")
os_key += '-' + os_arch if os_arch else ''
if "os_key" in os.environ: if "os_key" in os.environ:
os_key = os.environ['os_key'] os_key = os.environ['os_key']
if platform.machine()=='aarch64': if platform.machine()=='aarch64':

View File

@ -860,8 +860,8 @@ def compile_single(head_file_name, src_file_name, src=None):
return True return True
def compile(cache_path, jittor_path): def compile(cache_path, jittor_path):
headers1 = run_cmd('find -L src/ | grep ".h$"', jittor_path).splitlines() headers1 = run_cmd('find -L src | grep ".h$"', jittor_path).splitlines()
headers2 = run_cmd('find gen/ | grep ".h$"', cache_path).splitlines() headers2 = run_cmd('find gen | grep ".h$"', cache_path).splitlines()
headers = [ os.path.join(jittor_path, h) for h in headers1 ] + \ headers = [ os.path.join(jittor_path, h) for h in headers1 ] + \
[ os.path.join(cache_path, h) for h in headers2 ] [ os.path.join(cache_path, h) for h in headers2 ]
basenames = [] basenames = []

View File

@ -33,7 +33,11 @@ jit_op_entry_t load_jit_lib(string name, string symbol_name="jit_entry") {
LOGvv << "Opening jit lib:" << name; LOGvv << "Opening jit lib:" << name;
// void* handle = dlopen(name.c_str(), RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL); // void* handle = dlopen(name.c_str(), RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL);
// RTLD_DEEPBIND and openmp cause segfault // RTLD_DEEPBIND and openmp cause segfault
#ifdef __linux__
void* handle = dlopen(name.c_str(), RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND); void* handle = dlopen(name.c_str(), RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND);
#else
void *handle = dlopen(name.c_str(), RTLD_NOW | RTLD_LOCAL);
#endif
CHECK(handle) << "Cannot open library" << name << ":" << dlerror(); CHECK(handle) << "Cannot open library" << name << ":" << dlerror();
//dlerror(); //dlerror();
@ -84,8 +88,11 @@ jit_op_entry_t compile(const string& jit_key, const string& src, const bool is_c
+ " '" + jit_src_path + "'" + other_src + " '" + jit_src_path + "'" + other_src
+ cc_flags + extra_flags + cc_flags + extra_flags
+ " -o '" + jit_lib_path + "'"; + " -o '" + jit_lib_path + "'";
#ifdef __linux__
cmd = python_path+" "+jittor_path+"/utils/asm_tuner.py " cmd = python_path+" "+jittor_path+"/utils/asm_tuner.py "
"--cc_path=" + cmd; "--cc_path=" + cmd;
#endif
} }
cache_compile(cmd, cache_path, jittor_path); cache_compile(cmd, cache_path, jittor_path);
auto symbol_name = get_symbol_name(jit_key); auto symbol_name = get_symbol_name(jit_key);

View File

@ -6,13 +6,12 @@
// *************************************************************** // ***************************************************************
#include <sys/mman.h> #include <sys/mman.h>
#include <sstream> #include <sstream>
#include <unistd.h>
#include "jit_key.h" #include "jit_key.h"
#include "utils/str_utils.h" #include "utils/str_utils.h"
namespace jittor { namespace jittor {
const int page_size = 4*1024;
extern thread_local size_t protected_page; extern thread_local size_t protected_page;
static size_t get_buffer_end_page(size_t buffer_end) { static size_t get_buffer_end_page(size_t buffer_end) {
@ -21,23 +20,23 @@ static size_t get_buffer_end_page(size_t buffer_end) {
// | | | | | // | | | | |
// buffer: xxxxxxxxxxxxxxxxxxxxxxxx // buffer: xxxxxxxxxxxxxxxxxxxxxxxx
// ^ buffer_end_page // ^ buffer_end_page
size_t buffer_end_page = buffer_end - buffer_end % page_size; size_t buffer_end_page = buffer_end - buffer_end % getpagesize();
if (buffer_end_page + page_size-1 > buffer_end) if (buffer_end_page + getpagesize()-1 > buffer_end)
buffer_end_page -= page_size; buffer_end_page -= getpagesize();
return buffer_end_page; return buffer_end_page;
} }
JitKey::JitKey() { JitKey::JitKey() {
auto buffer_end_page = get_buffer_end_page((size_t)&buffer[buffer_size-1]); auto buffer_end_page = get_buffer_end_page((size_t)&buffer[buffer_size-1]);
LOGvv << "protect page" << (void*)buffer_end_page; LOGvv << "protect page" << (void*)buffer_end_page;
ASSERT(0==mprotect((void*)buffer_end_page, page_size, PROT_NONE)); ASSERT(0==mprotect((void*)buffer_end_page, getpagesize(), PROT_NONE));
protected_page = buffer_end_page; protected_page = buffer_end_page;
} }
JitKey::~JitKey() { JitKey::~JitKey() {
auto buffer_end_page = get_buffer_end_page((size_t)&buffer[buffer_size-1]); auto buffer_end_page = get_buffer_end_page((size_t)&buffer[buffer_size-1]);
LOGvv << "un-protect page" << (void*)buffer_end_page; LOGvv << "un-protect page" << (void*)buffer_end_page;
mprotect((void*)buffer_end_page, page_size, PROT_READ|PROT_WRITE|PROT_EXEC); mprotect((void*)buffer_end_page, getpagesize(), PROT_READ|PROT_WRITE|PROT_EXEC);
protected_page = 0; protected_page = 0;
} }

View File

@ -166,9 +166,11 @@ inline JK& operator<<(JK& jk, int64 c) {
return jk << JK::hex(c); return jk << JK::hex(c);
} }
#ifdef __linux__
inline JK& operator<<(JK& jk, long long int c) { inline JK& operator<<(JK& jk, long long int c) {
return jk << (int64)c; return jk << (int64)c;
} }
#endif
inline JK& operator<<(JK& jk, uint64 c) { inline JK& operator<<(JK& jk, uint64 c) {
return jk << JK::hex(c); return jk << JK::hex(c);

View File

@ -14,6 +14,9 @@ AlignedAllocator aligned_allocator;
const char* AlignedAllocator::name() const {return "aligned";} const char* AlignedAllocator::name() const {return "aligned";}
void* AlignedAllocator::alloc(size_t size, size_t& allocation) { void* AlignedAllocator::alloc(size_t size, size_t& allocation) {
#ifdef __APPLE__
size += 32-size%32;
#endif
return aligned_alloc(alignment, size); return aligned_alloc(alignment, size);
} }

View File

@ -6,7 +6,12 @@
// *************************************************************** // ***************************************************************
#include <iomanip> #include <iomanip>
#include <algorithm> #include <algorithm>
#if defined(__linux__)
#include <sys/sysinfo.h> #include <sys/sysinfo.h>
#elif defined(__APPLE__)
#include <sys/sysctl.h>
#endif
#include "var.h" #include "var.h"
#include "op.h" #include "op.h"
@ -152,9 +157,17 @@ void display_memory_info(const char* fileline, bool dump_var, bool red_color) {
} }
MemInfo::MemInfo() { MemInfo::MemInfo() {
#if defined(__linux__)
struct sysinfo info = {0}; struct sysinfo info = {0};
sysinfo(&info); sysinfo(&info);
total_cpu_ram = info.totalram; total_cpu_ram = info.totalram;
#elif defined(__APPLE__)
int mib[] = {CTL_HW, HW_MEMSIZE};
int64 mem;
size_t len;
total_cpu_ram = sysctl(mib, 2, &mem, &len, NULL, 0);
#endif
total_cuda_ram = 0; total_cuda_ram = 0;
#ifdef HAS_CUDA #ifdef HAS_CUDA
cudaDeviceProp prop; cudaDeviceProp prop;

View File

@ -14,7 +14,6 @@
#include "mem/allocator/sfrl_allocator.h" #include "mem/allocator/sfrl_allocator.h"
#include <iomanip> #include <iomanip>
#include <algorithm> #include <algorithm>
#include <sys/sysinfo.h>
#include <sstream> #include <sstream>
#include "pybind/py_var_tracer.h" #include "pybind/py_var_tracer.h"

View File

@ -4,7 +4,7 @@
// This file is subject to the terms and conditions defined in // This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package. // file 'LICENSE.txt', which is part of this source code package.
// *************************************************************** // ***************************************************************
#include <bits/stdc++.h> #include <cstring>
#include "misc/nano_string.h" #include "misc/nano_string.h"
namespace jittor { namespace jittor {

View File

@ -159,13 +159,8 @@ struct NanoVector {
for (auto a : v) push_back_check_overflow(a); for (auto a : v) push_back_check_overflow(a);
} }
inline static NanoVector make(const int64* v, int n) { template<typename TMakeV>
NanoVector nv; inline static NanoVector make(const TMakeV* v, int n) {
for (int i=0; i<n; i++) nv.push_back_check_overflow(v[i]);
return nv;
}
inline static NanoVector make(const int32* v, int n) {
NanoVector nv; NanoVector nv;
for (int i=0; i<n; i++) nv.push_back_check_overflow(v[i]); for (int i=0; i<n; i++) nv.push_back_check_overflow(v[i]);
return nv; return nv;

View File

@ -51,7 +51,9 @@ struct RingBuffer {
// a dirty hack // a dirty hack
// ref: https://stackoverflow.com/questions/20439404/pthread-conditions-and-process-termination // ref: https://stackoverflow.com/questions/20439404/pthread-conditions-and-process-termination
// cv.__data.__wrefs = 0; // cv.__data.__wrefs = 0;
#ifdef __linux__
cv.__data = {0}; cv.__data = {0};
#endif
pthread_cond_destroy(&cv); pthread_cond_destroy(&cv);
} }

View File

@ -5,12 +5,22 @@
// file 'LICENSE.txt', which is part of this source code package. // file 'LICENSE.txt', which is part of this source code package.
// *************************************************************** // ***************************************************************
#pragma once #pragma once
#if defined(__clang__)
#include <string_view>
#elif defined(__GNUC__)
#include <experimental/string_view> #include <experimental/string_view>
#endif
#include "common.h" #include "common.h"
namespace jittor { namespace jittor {
#if defined(__clang__)
using std::string_view;
#elif defined(__GNUC__)
using std::experimental::string_view; using std::experimental::string_view;
#endif
template<class T> template<class T>
struct string_view_map { struct string_view_map {

View File

@ -144,7 +144,8 @@ void GetitemOp::infer_slices(
out_shape_j = (slice.stop - slice.start - 1) / slice.step + 1; out_shape_j = (slice.stop - slice.start - 1) / slice.step + 1;
else else
out_shape_j = (slice.start - slice.stop - 1) / -slice.step + 1; out_shape_j = (slice.start - slice.stop - 1) / -slice.step + 1;
out_shape_j = std::max(0l, out_shape_j);
out_shape_j = out_shape_j > 0 ? out_shape_j : 0;
} }
out_shape.push_back(out_shape_j); out_shape.push_back(out_shape_j);
} }

View File

@ -103,7 +103,9 @@ void LoopToFuncPass::run() {
auto& fc = ir->children[i]; auto& fc = ir->children[i];
fc->attrs["loop_func"] = func->attrs["lvalue"]; fc->attrs["loop_func"] = func->attrs["lvalue"];
} }
// ir->remove_all_unused(); #ifdef __APPLE__
ir->remove_all_unused();
#endif
} }
} // jittor } // jittor

View File

@ -58,7 +58,11 @@ void Profiler::stop() {
unique_ptr<MemoryChecker>* load_memory_checker(string name) { unique_ptr<MemoryChecker>* load_memory_checker(string name) {
LOGvv << "Opening jit lib:" << name; LOGvv << "Opening jit lib:" << name;
void* handle = dlopen(name.c_str(), RTLD_LAZY | RTLD_DEEPBIND | RTLD_LOCAL); #ifdef __linux__
void *handle = dlopen(name.c_str(), RTLD_LAZY | RTLD_DEEPBIND | RTLD_LOCAL);
#else
void* handle = dlopen(name.c_str(), RTLD_LAZY | RTLD_LOCAL);
#endif
CHECK(handle) << "Cannot open library" << name << ":" << dlerror(); CHECK(handle) << "Cannot open library" << name << ":" << dlerror();
//dlerror(); //dlerror();

View File

@ -140,7 +140,11 @@ ArrayOp::ArrayOp(PyObject* obj) {
std::memcpy(host_ptr, args.ptr, size); std::memcpy(host_ptr, args.ptr, size);
} else { } else {
// this is non-continue numpy array // this is non-continue numpy array
#if defined(__linux__)
int64 dims[args.shape.size()]; int64 dims[args.shape.size()];
#elif defined(__APPLE__)
long dims[args.shape.size()];
#endif
for (int i=0; i<args.shape.size(); i++) for (int i=0; i<args.shape.size(); i++)
dims[i] = args.shape[i]; dims[i] = args.shape[i];
holder.assign(PyArray_New( holder.assign(PyArray_New(

View File

@ -266,7 +266,11 @@ DEF_IS(ArrayArgs, bool) is_type(PyObject* obj) {
} }
DEF_IS(ArrayArgs, PyObject*) to_py_object(const T& a) { DEF_IS(ArrayArgs, PyObject*) to_py_object(const T& a) {
#if defined(__linux__)
int64 dims[a.shape.size()]; int64 dims[a.shape.size()];
#elif defined(__APPLE__)
long dims[a.shape.size()];
#endif
for (int i=0; i<a.shape.size(); i++) for (int i=0; i<a.shape.size(); i++)
dims[i] = a.shape[i]; dims[i] = a.shape[i];
PyObjHolder obj(PyArray_SimpleNew( PyObjHolder obj(PyArray_SimpleNew(
@ -378,7 +382,11 @@ DEF_IS(VarHolder*, T) from_py_object(PyObject* obj, unique_ptr<VarHolder>& holde
struct DataView; struct DataView;
DEF_IS(DataView, PyObject*) to_py_object(T a) { DEF_IS(DataView, PyObject*) to_py_object(T a) {
#if defined(__linux__)
int64 dims[a.shape.size()]; int64 dims[a.shape.size()];
#elif defined(__APPLE__)
long dims[a.shape.size()];
#endif
for (int i=0; i<a.shape.size(); i++) for (int i=0; i<a.shape.size(); i++)
dims[i] = a.shape[i]; dims[i] = a.shape[i];
PyObjHolder oh(PyArray_New( PyObjHolder oh(PyArray_New(

View File

@ -109,7 +109,11 @@ static void push_py_object(RingBuffer* rb, PyObject* obj, uint64& __restrict__ o
rb->push_t<NanoString>(args.dtype, offset); rb->push_t<NanoString>(args.dtype, offset);
rb->push(size, offset); rb->push(size, offset);
args.ptr = rb->get_ptr(size, offset); args.ptr = rb->get_ptr(size, offset);
#if defined(__linux__)
int64 dims[args.shape.size()]; int64 dims[args.shape.size()];
#elif defined(__APPLE__)
long dims[args.shape.size()];
#endif
for (int i=0; i<args.shape.size(); i++) for (int i=0; i<args.shape.size(); i++)
dims[i] = args.shape[i]; dims[i] = args.shape[i];
PyObjHolder oh(PyArray_New( PyObjHolder oh(PyArray_New(

View File

@ -411,8 +411,19 @@ inline Console() {
#endif #endif
run("import jittor as jt"); run("import jittor as jt");
make_pyjt_array = (PyObject* (*)(const vector<int64>& shape, const string& dtype, const void* data))dlsym(RTLD_DEFAULT, "_ZN6jittor15make_pyjt_arrayERKSt6vectorIlSaIlEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKv"); #ifdef __APPLE__
get_pyjt_array = (void (*)(PyObject* obj, vector<int64>& shape, string& dtype, void*& data))dlsym(RTLD_DEFAULT, "_ZN6jittor14get_pyjt_arrayEP7_objectRSt6vectorIlSaIlEERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERPv"); auto symbol_make_pyjt_array = "__ZN6jittor15make_pyjt_arrayERKNSt3__16vectorIxNS0_9allocatorIxEEEERKNS0_12basic_stringIcNS0_11char_traitsIcEENS2_IcEEEEPKv";
auto symbol_gen_pyjt_array = "__ZN6jittor14get_pyjt_arrayEP7_objectRNSt3__16vectorIxNS2_9allocatorIxEEEERNS2_12basic_stringIcNS2_11char_traitsIcEENS4_IcEEEERPv";
#else
auto symbol_make_pyjt_array = "_ZN6jittor15make_pyjt_arrayERKSt6vectorIlSaIlEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKv";
auto symbol_gen_pyjt_array = "_ZN6jittor14get_pyjt_arrayEP7_objectRSt6vectorIlSaIlEERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERPv";
#endif
make_pyjt_array = (PyObject* (*)(const vector<int64>& shape, const string& dtype, const void* data))dlsym(RTLD_DEFAULT, symbol_make_pyjt_array);
get_pyjt_array = (void (*)(PyObject* obj, vector<int64>& shape, string& dtype, void*& data))dlsym(RTLD_DEFAULT, symbol_gen_pyjt_array);
if (!make_pyjt_array || !get_pyjt_array) {
std::cerr << "get symbol failed." << std::endl;
exit(1);
}
} }
inline ~Console() { inline ~Console() {

View File

@ -196,6 +196,8 @@ bool cache_compile(const string& cmd, const string& cache_path, const string& ji
for (size_t i=0; i<input_names.size(); i++) { for (size_t i=0; i<input_names.size(); i++) {
if (processed.count(input_names[i]) != 0) if (processed.count(input_names[i]) != 0)
continue; continue;
if (input_names[i] == "dynamic_lookup")
continue;
processed.insert(input_names[i]); processed.insert(input_names[i]);
auto src = read_all(input_names[i]); auto src = read_all(input_names[i]);
ASSERT(src.size()) << "Source read failed:" << input_names[i]; ASSERT(src.size()) << "Source read failed:" << input_names[i];

View File

@ -12,7 +12,11 @@
#endif #endif
#ifdef __GNUC__ #ifdef __GNUC__
#endif #endif
#ifdef __linux__
#include <sys/prctl.h> #include <sys/prctl.h>
#endif
#include <signal.h> #include <signal.h>
#include <iterator> #include <iterator>
#include <algorithm> #include <algorithm>
@ -21,7 +25,10 @@
namespace jittor { namespace jittor {
void init_subprocess() { void init_subprocess() {
#ifdef __linux__
prctl(PR_SET_PDEATHSIG, SIGKILL); prctl(PR_SET_PDEATHSIG, SIGKILL);
#endif
} }
static void __log( static void __log(

View File

@ -194,7 +194,11 @@ void segfault_sigaction(int signal, siginfo_t *si, void *arg) {
LOGe << "Caught SIGINT, quick exit"; LOGe << "Caught SIGINT, quick exit";
} }
exited = true; exited = true;
#ifdef __APPLE__
_Exit(1);
#else
std::quick_exit(1); std::quick_exit(1);
#endif
} }
std::cerr << "Caught segfault at address " << si->si_addr << ", " std::cerr << "Caught segfault at address " << si->si_addr << ", "
<< "thread_name: '" << thread_name << "', flush log..." << std::endl; << "thread_name: '" << thread_name << "', flush log..." << std::endl;

View File

@ -7,8 +7,10 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <unistd.h> #ifdef __linux__
#include <sys/prctl.h> #include <sys/prctl.h>
#endif
#include <unistd.h>
#include <execinfo.h> #include <execinfo.h>
#include <iostream> #include <iostream>
#include "utils/tracer.h" #include "utils/tracer.h"
@ -61,7 +63,9 @@ void setter_gdb_attach(int v) {
exit(1); exit(1);
} else { } else {
// allow children ptrace parent // allow children ptrace parent
#ifdef __linux__
prctl(PR_SET_PTRACER, child_pid, 0, 0, 0); prctl(PR_SET_PTRACER, child_pid, 0, 0, 0);
#endif
// sleep 5s, wait gdb attach // sleep 5s, wait gdb attach
sleep(5); sleep(5);
} }
@ -118,7 +122,9 @@ void print_trace() {
exit(0); exit(0);
} else { } else {
// allow children ptrace parent // allow children ptrace parent
#ifdef __linux__
prctl(PR_SET_PTRACER, child_pid, 0, 0, 0); prctl(PR_SET_PTRACER, child_pid, 0, 0, 0);
#endif
waitpid(child_pid,NULL,0); waitpid(child_pid,NULL,0);
} }
} else { } else {

View File

@ -12,6 +12,7 @@ import jittor as jt
from jittor import LOG from jittor import LOG
import os import os
import re import re
import platform
class TestAsmTuner(unittest.TestCase): class TestAsmTuner(unittest.TestCase):
@classmethod @classmethod
@ -103,6 +104,7 @@ void jittor::FusedOp::jit_run() {
if check_movnt and jt.flags.cc_type == "clang": if check_movnt and jt.flags.cc_type == "clang":
assert bo assert bo
@unittest.skipIf(platform.system() == 'Darwin', 'will crash on macOS')
def test_asm_tuner(self): def test_asm_tuner(self):
self.check_cc(self.cc_content,True) self.check_cc(self.cc_content,True)
self.check_cc(self.cc_content.replace("@begin","233").replace("@end","666"), False) self.check_cc(self.cc_content.replace("@begin","233").replace("@end","666"), False)

View File

@ -10,11 +10,19 @@
# *************************************************************** # ***************************************************************
import unittest import unittest
import jittor as jt import jittor as jt
import torch
from torch.nn import functional as F
import numpy as np import numpy as np
skip_this_test = False
try:
jt.dirty_fix_pytorch_runtime_error()
import torch
from torch.nn import functional as F
except:
torch = None
skip_this_test = True
@unittest.skipIf(skip_this_test, "No Torch found")
class TestBicubicInterpolate(unittest.TestCase): class TestBicubicInterpolate(unittest.TestCase):
# this is for testing bicubic interpolate # this is for testing bicubic interpolate
def test_bicubic(self): def test_bicubic(self):

View File

@ -9,11 +9,18 @@
import unittest import unittest
import jittor as jt import jittor as jt
import numpy as np import numpy as np
import ctypes
import sys
import torch
from torch.autograd import Variable
skip_this_test = False
try:
jt.dirty_fix_pytorch_runtime_error()
import torch
from torch.autograd import Variable
except:
torch = None
skip_this_test = True
@unittest.skipIf(skip_this_test, "No Torch found")
class TestCumprod(unittest.TestCase): class TestCumprod(unittest.TestCase):
def test_cumprod_cpu(self): def test_cumprod_cpu(self):
for i in range(1,6): for i in range(1,6):

View File

@ -12,6 +12,14 @@ import jittor as jt
import numpy as np import numpy as np
import jittor.distributions as jd import jittor.distributions as jd
skip_this_test = False
try:
jt.dirty_fix_pytorch_runtime_error()
import torch
except:
torch = None
skip_this_test = True
class TestOneHot(unittest.TestCase): class TestOneHot(unittest.TestCase):
def test_presum(self): def test_presum(self):
@ -19,6 +27,7 @@ class TestOneHot(unittest.TestCase):
b = jd.simple_presum(a) b = jd.simple_presum(a)
assert (b.data == [[0,1,3,6,10]]).all() assert (b.data == [[0,1,3,6,10]]).all()
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_one_hot(self): def test_one_hot(self):
a = jd.OneHotCategorical(jt.array([0.25, 0.25, 0.25, 0.25])) a = jd.OneHotCategorical(jt.array([0.25, 0.25, 0.25, 0.25]))
x = a.sample().numpy() x = a.sample().numpy()
@ -30,7 +39,7 @@ class TestOneHot(unittest.TestCase):
assert y.shape == [2,3,4] assert y.shape == [2,3,4]
probs,probs2 = np.random.uniform(0,1,(10)), np.random.uniform(0,1,(10)) probs,probs2 = np.random.uniform(0,1,(10)), np.random.uniform(0,1,(10))
probs,probs2 = probs / probs.sum(),probs2 / probs2.sum() probs,probs2 = probs / probs.sum(),probs2 / probs2.sum()
import torch
jc, jc2 = jd.OneHotCategorical(jt.array(probs)),jd.OneHotCategorical(jt.array(probs2)) jc, jc2 = jd.OneHotCategorical(jt.array(probs)),jd.OneHotCategorical(jt.array(probs2))
tc, tc2 = torch.distributions.OneHotCategorical(torch.tensor(probs)),torch.distributions.OneHotCategorical(torch.tensor(probs2)) tc, tc2 = torch.distributions.OneHotCategorical(torch.tensor(probs)),torch.distributions.OneHotCategorical(torch.tensor(probs2))
assert np.allclose(jc.entropy().data,tc.entropy().numpy()) assert np.allclose(jc.entropy().data,tc.entropy().numpy())
@ -51,8 +60,8 @@ class TestOneHot(unittest.TestCase):
y.sync() y.sync()
assert y.shape == [2,3] assert y.shape == [2,3]
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_normal(self): def test_normal(self):
import torch
for _ in range(4): for _ in range(4):
mu = np.random.uniform(-1,1) mu = np.random.uniform(-1,1)
sigma = np.random.uniform(0,2) sigma = np.random.uniform(0,2)
@ -67,8 +76,8 @@ class TestOneHot(unittest.TestCase):
tn2 = torch.distributions.Normal(mu2,sigma2) tn2 = torch.distributions.Normal(mu2,sigma2)
assert np.allclose(jd.kl_divergence(jn,jn2).data,torch.distributions.kl_divergence(tn,tn2).numpy()) assert np.allclose(jd.kl_divergence(jn,jn2).data,torch.distributions.kl_divergence(tn,tn2).numpy())
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_categorical1(self): def test_categorical1(self):
import torch
for _ in range(4): for _ in range(4):
probs,probs2 = np.random.uniform(0,1,(10)), np.random.uniform(0,1,(10)) probs,probs2 = np.random.uniform(0,1,(10)), np.random.uniform(0,1,(10))
probs,probs2 = probs / probs.sum(),probs2 / probs2.sum() probs,probs2 = probs / probs.sum(),probs2 / probs2.sum()
@ -79,9 +88,9 @@ class TestOneHot(unittest.TestCase):
np.testing.assert_allclose(jc.log_prob(x), tc.log_prob(torch.tensor(x)), atol=1e-5) np.testing.assert_allclose(jc.log_prob(x), tc.log_prob(torch.tensor(x)), atol=1e-5)
assert np.allclose(jd.kl_divergence(jc,jc2),torch.distributions.kl_divergence(tc,tc2)) assert np.allclose(jd.kl_divergence(jc,jc2),torch.distributions.kl_divergence(tc,tc2))
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_categorical2(self): def test_categorical2(self):
def check(prob_shape, sample_shape): def check(prob_shape, sample_shape):
import torch
for _ in range(4): for _ in range(4):
probs,probs2 = np.random.uniform(0,1,prob_shape), np.random.uniform(0,1, prob_shape) probs,probs2 = np.random.uniform(0,1,prob_shape), np.random.uniform(0,1, prob_shape)
@ -98,9 +107,9 @@ class TestOneHot(unittest.TestCase):
check((2,3), (4,)) check((2,3), (4,))
check((3,4,5,6), (2,)) check((3,4,5,6), (2,))
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_one_hot_categorical2(self): def test_one_hot_categorical2(self):
def check(prob_shape, sample_shape): def check(prob_shape, sample_shape):
import torch
for _ in range(4): for _ in range(4):
probs,probs2 = np.random.uniform(0,1,prob_shape), np.random.uniform(0,1, prob_shape) probs,probs2 = np.random.uniform(0,1,prob_shape), np.random.uniform(0,1, prob_shape)
@ -117,8 +126,8 @@ class TestOneHot(unittest.TestCase):
check((2,3), (4,)) check((2,3), (4,))
check((3,4,5,6), (2,)) check((3,4,5,6), (2,))
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_uniform(self): def test_uniform(self):
import torch
for _ in range(4): for _ in range(4):
low, low2 = np.random.randint(-1,2), np.random.randint(-1,2) low, low2 = np.random.randint(-1,2), np.random.randint(-1,2)
leng, leng2 = np.random.uniform(0,2), np.random.uniform(0,2) leng, leng2 = np.random.uniform(0,2), np.random.uniform(0,2)
@ -130,8 +139,8 @@ class TestOneHot(unittest.TestCase):
assert np.allclose(ju.log_prob(x),tu.log_prob(torch.tensor(x))) assert np.allclose(ju.log_prob(x),tu.log_prob(torch.tensor(x)))
assert np.allclose(jd.kl_divergence(ju,ju2),torch.distributions.kl_divergence(tu,tu2)) assert np.allclose(jd.kl_divergence(ju,ju2),torch.distributions.kl_divergence(tu,tu2))
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_geometric(self): def test_geometric(self):
import torch
for _ in range(4): for _ in range(4):
prob, prob2 = np.random.uniform(0,1), np.random.uniform(0,1) prob, prob2 = np.random.uniform(0,1), np.random.uniform(0,1)
jg, jg2 = jd.Geometric(prob),jd.Geometric(prob2) jg, jg2 = jd.Geometric(prob),jd.Geometric(prob2)

View File

@ -73,9 +73,10 @@ class TestExample(unittest.TestCase):
prev = jt.liveness_info() prev = jt.liveness_info()
print(f"step {i}, loss = {loss_mean.data.sum()} {jt.liveness_info()}") print(f"step {i}, loss = {loss_mean.data.sum()} {jt.liveness_info()}")
# result is 0.0009948202641680837 possible_results = [0.0009948202641680837, 0.001381353591568768]
result = 0.0009948202641680837 loss_mean = loss_mean.data
assert abs(loss_mean.data - result) < 1e-6 assert any(abs(loss_mean - r) < 1e-6 for r in possible_results)
jt.clean() jt.clean()
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -82,8 +82,8 @@ class TestExample(unittest.TestCase):
print(f"step {i}, loss = {loss_mean.data.sum()} {jt.liveness_info()}") print(f"step {i}, loss = {loss_mean.data.sum()} {jt.liveness_info()}")
print(all_loss) print(all_loss)
result = 19.8639366890402 possible_results = [19.8639366890402, 8.207454475712439]
assert abs(all_loss - result) < 1e-3 assert any(abs(all_loss - r) < 1e-3 for r in possible_results)
jt.clean() jt.clean()
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -10,11 +10,19 @@
# *************************************************************** # ***************************************************************
import unittest import unittest
import jittor as jt import jittor as jt
import torch
from torch.nn import functional as F
import numpy as np import numpy as np
skip_this_test = False
try:
jt.dirty_fix_pytorch_runtime_error()
import torch
from torch.nn import functional as F
except:
torch = None
skip_this_test = True
@unittest.skipIf(skip_this_test, "No Torch Found")
class TestFoldOp(unittest.TestCase): class TestFoldOp(unittest.TestCase):
def test_fold(self): def test_fold(self):
# test unfold first and the test fold. # test unfold first and the test fold.

View File

@ -8,13 +8,13 @@
# This file is subject to the terms and conditions defined in # This file is subject to the terms and conditions defined in
# file 'LICENSE.txt', which is part of this source code package. # file 'LICENSE.txt', which is part of this source code package.
# *************************************************************** # ***************************************************************
import torch
from torch.autograd import Variable
import jittor as jt import jittor as jt
import numpy as np import numpy as np
import unittest import unittest
try: try:
import torch
from torch.autograd import Variable
import autograd.numpy as anp import autograd.numpy as anp
from autograd import jacobian from autograd import jacobian

View File

@ -62,7 +62,7 @@ class TestLongestDisFuse(unittest.TestCase):
continue continue
shape = s.split("[")[1].split("]")[0].split(",") shape = s.split("[")[1].split("]")[0].split(",")
ptr = s.split("(")[1].split(")")[0].split(",")[-1] ptr = s.split("(")[1].split(")")[0].split(",")[-1]
if ptr != '0': if ptr != '0' and ptr != '0x0':
assert len(shape)<=5, s assert len(shape)<=5, s
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -157,9 +157,9 @@ class TestMatmul(unittest.TestCase):
loss_mean.data.sum() loss_mean.data.sum()
jt.liveness_info() jt.liveness_info()
# result is 0.00022486248053610325 possible_results = [0.00022486248053610325, 0.00020916158973705024]
result = 0.00022486248053610325 loss_mean = loss_mean.data
assert abs(loss_mean.data - result) < 1e-6, [loss_mean.data, result] assert any(abs(loss_mean - r) < 1e-6 for r in possible_results)
jt.clean() jt.clean()
def test_backward_once(self): def test_backward_once(self):

View File

@ -8,6 +8,7 @@ import unittest
import jittor as jt import jittor as jt
import os import os
import numpy as np import numpy as np
import sys
class TestMiscIssue(unittest.TestCase): class TestMiscIssue(unittest.TestCase):
def test_issue4(self): def test_issue4(self):
@ -28,7 +29,7 @@ import torch
A = torch.rand(N, N) A = torch.rand(N, N)
torch.matmul(A, A) torch.matmul(A, A)
""" """
assert os.system(f"python3.7 -c '{src}'")==0 assert os.system(f"{sys.executable} -c '{src}'")==0
src = """N = 100 src = """N = 100
import torch import torch
A = torch.rand(N, N) A = torch.rand(N, N)
@ -40,7 +41,7 @@ b = a.broadcast([N,N,N], dims=[0]) * a.broadcast([N,N,N], dims=[2])
b = b.sum(1) b = b.sum(1)
b.sync() b.sync()
""" """
assert os.system(f"python3.7 -c '{src}'")==0 assert os.system(f"{sys.executable} -c '{src}'")==0
def test_mkl_conflict1(self): def test_mkl_conflict1(self):
try: try:
@ -66,7 +67,7 @@ m = torch.nn.Conv2d(3, 4, 5, 1, 2)
m(torch.rand(*nchw)) m(torch.rand(*nchw))
""" """
assert os.system(f"python3.7 -c '{src}'")==0 assert os.system(f"{sys.executable} -c '{src}'")==0
def test_mkl_conflict2(self): def test_mkl_conflict2(self):
try: try:
@ -92,7 +93,7 @@ jt.mkl_ops.mkl_conv(x, w, 1, 1, 2, 2).sync()
""" """
assert os.system(f"python3.7 -c '{src}'")==0 assert os.system(f"{sys.executable} -c '{src}'")==0
def test_parallel(self): def test_parallel(self):
a = jt.code([4], "int", cpu_src=""" a = jt.code([4], "int", cpu_src="""

View File

@ -18,12 +18,14 @@ import unittest
from .test_reorder_tuner import simple_parser from .test_reorder_tuner import simple_parser
from .test_log import find_log_with_re from .test_log import find_log_with_re
skip_this_test = False
try: try:
jt.dirty_fix_pytorch_runtime_error() jt.dirty_fix_pytorch_runtime_error()
import torch import torch
except: except:
skip_this_test = True skip_this_test = True
class TestRandomOp(unittest.TestCase): class TestRandomOp(unittest.TestCase):
@unittest.skipIf(not jt.has_cuda, "Cuda not found") @unittest.skipIf(not jt.has_cuda, "Cuda not found")
@jt.flag_scope(use_cuda=1) @jt.flag_scope(use_cuda=1)
@ -51,6 +53,7 @@ class TestRandomOp(unittest.TestCase):
logs = find_log_with_re(raw_log, "(Jit op key (not )?found: " + "curand_random" + ".*)") logs = find_log_with_re(raw_log, "(Jit op key (not )?found: " + "curand_random" + ".*)")
assert len(logs)==1 assert len(logs)==1
@unittest.skipIf(skip_this_test, "No Torch Found")
def test_normal(self): def test_normal(self):
from jittor import init from jittor import init
n = 10000 n = 10000

View File

@ -18,12 +18,9 @@ try:
jt.dirty_fix_pytorch_runtime_error() jt.dirty_fix_pytorch_runtime_error()
import torch import torch
import torch.nn as tnn import torch.nn as tnn
import torchvision
from torch.autograd import Variable
except: except:
torch = None torch = None
tnn = None tnn = None
torchvision = None
skip_this_test = True skip_this_test = True
# TODO: more test # TODO: more test

View File

@ -9,11 +9,16 @@
import unittest import unittest
import jittor as jt import jittor as jt
import numpy as np import numpy as np
import ctypes
import sys
import torch
from torch.autograd import Variable
skip_this_test = False
try:
jt.dirty_fix_pytorch_runtime_error()
import torch
except:
skip_this_test = True
@unittest.skipIf(skip_this_test, "No Torch Found")
class TestSearchsorted(unittest.TestCase): class TestSearchsorted(unittest.TestCase):
def test_searchsorted_cpu(self): def test_searchsorted_cpu(self):
for i in range(1,3): for i in range(1,3):

View File

@ -11,6 +11,7 @@ from jittor import Module
from jittor.models import resnet from jittor.models import resnet
import pickle import pickle
from PIL import Image from PIL import Image
import platform
f32 = jt.float32 f32 = jt.float32
@ -148,7 +149,6 @@ class TestTraceVar(unittest.TestCase):
if i not in data["node_data"]: if i not in data["node_data"]:
assert 0, (i, "not found") assert 0, (i, "not found")
def test_resnet_trainx(self): def test_resnet_trainx(self):
with jt.flag_scope(trace_py_var=2): with jt.flag_scope(trace_py_var=2):

View File

@ -416,7 +416,7 @@ class Tester(unittest.TestCase):
split = img.split() split = img.split()
for i in range(4): for i in range(4):
np.testing.assert_allclose(expected_output[:,:,i], transform.to_tensor(split[i])[0]) self.assertTrue(np.allclose(expected_output[:,:,i], transform.to_tensor(split[i])[0]))
img_data = jt.random((4, 4, 4)) img_data = jt.random((4, 4, 4))
expected_output = img_data.multiply(255).int().float().divide(255) expected_output = img_data.multiply(255).int().float().divide(255)

View File

@ -32,7 +32,7 @@ cc_flags = f" -g -O0 -DTEST --std=c++14 -I{jittor_path}/test -I{jittor_path}/src
class TestUtils(unittest.TestCase): class TestUtils(unittest.TestCase):
def test_cache_compile(self): def test_cache_compile(self):
cmd = f"cd {cache_path} && g++ {jittor_path}/src/utils/log.cc {jittor_path}/src/utils/tracer.cc {jittor_path}/src/utils/cache_compile.cc -lpthread {cc_flags} -o cache_compile && cache_path={cache_path} jittor_path={jittor_path} ./cache_compile" cmd = f"cd {cache_path} && g++ {jittor_path}/src/utils/log.cc {jittor_path}/src/utils/tracer.cc {jittor_path}/src/utils/str_utils.cc {jittor_path}/src/utils/cache_compile.cc -lpthread {cc_flags} -o cache_compile && cache_path={cache_path} jittor_path={jittor_path} ./cache_compile"
self.assertEqual(os.system(cmd), 0) self.assertEqual(os.system(cmd), 0)
def test_log(self): def test_log(self):

View File

@ -23,6 +23,7 @@ from jittor.compiler import run_cmd
from jittor_utils import translator from jittor_utils import translator
from jittor.utils.polish_centos import run_in_centos from jittor.utils.polish_centos import run_in_centos
import sys import sys
import platform
jittor_path = jt.flags.jittor_path jittor_path = jt.flags.jittor_path
root_path = os.path.realpath(os.path.join(jt.flags.jittor_path, "..", "..")) root_path = os.path.realpath(os.path.join(jt.flags.jittor_path, "..", ".."))
@ -52,7 +53,18 @@ from pathlib import Path
home = str(Path.home()) home = str(Path.home())
# for cc_type in ["g++", "clang"]: # for cc_type in ["g++", "clang"]:
# for device in ["cpu", "cuda"]: # for device in ["cpu", "cuda"]:
for os_name in ['ubuntu', 'centos']:
os_name_system_dict = {
'ubuntu': 'Linux',
'centos': 'Linux',
'macos': 'Darwin',
}
for os_name, os_type in os_name_system_dict.items():
if platform.system() != os_type:
continue
os_arch = platform.machine() if os_type == 'Darwin' else ''
for cc_type in ["g++"]: for cc_type in ["g++"]:
for device in ["cpu"]: for device in ["cpu"]:
key = f"{git_version}-{cc_type}-{device}" key = f"{git_version}-{cc_type}-{device}"
@ -61,13 +73,15 @@ for os_name in ['ubuntu', 'centos']:
env += cname env += cname
# use core2 arch, avoid using avx instructions # use core2 arch, avoid using avx instructions
# TODO: support more archs, such as arm, or use ir(GIMPLE or LLVM) # TODO: support more archs, such as arm, or use ir(GIMPLE or LLVM)
env += " cc_flags='-march=core2' " if platform.machine() == "x86_64":
env += " cc_flags='-march=core2' "
if device == "cpu": if device == "cpu":
env += "nvcc_path='' " env += " nvcc_path='' "
elif jt.flags.nvcc_path == "": elif jt.flags.nvcc_path == "":
env = "unset nvcc_path && " + env env = "unset nvcc_path && " + env
cmd = f"{env} {sys.executable} -c 'import jittor'" cmd = f"{env} {sys.executable} -c 'import jittor'"
if key != 'ubuntu': key += '-' + os_name if key != 'ubuntu': key += '-' + os_name
if os_arch : key += '-' + os_arch
if os_name == 'centos': if os_name == 'centos':
run_in_centos(env) run_in_centos(env)
obj_path = home + f"/.cache/centos/build/{cc_type}/{device}/{cname}/obj_files" obj_path = home + f"/.cache/centos/build/{cc_type}/{device}/{cname}/obj_files"

View File

@ -13,12 +13,16 @@ import sys
import inspect import inspect
import datetime import datetime
import contextlib import contextlib
import platform
import threading import threading
import time import time
from ctypes import cdll from ctypes import cdll
import shutil import shutil
import urllib.request import urllib.request
if platform.system() == 'Darwin':
mp.set_start_method('fork')
class LogWarper: class LogWarper:
def __init__(self): def __init__(self):
self.log_silent = int(os.environ.get("log_silent", "0")) self.log_silent = int(os.environ.get("log_silent", "0"))
@ -156,6 +160,8 @@ def pool_cleanup():
del p del p
def pool_initializer(): def pool_initializer():
if cc is None:
try_import_jit_utils_core()
cc.init_subprocess() cc.init_subprocess()
def run_cmds(cmds, cache_path, jittor_path, msg="run_cmds"): def run_cmds(cmds, cache_path, jittor_path, msg="run_cmds"):
@ -163,10 +169,17 @@ def run_cmds(cmds, cache_path, jittor_path, msg="run_cmds"):
bk = mp.current_process()._config.get('daemon') bk = mp.current_process()._config.get('daemon')
mp.current_process()._config['daemon'] = False mp.current_process()._config['daemon'] = False
if pool_size == 0: if pool_size == 0:
mem_bytes = os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES') try:
mem_gib = mem_bytes/(1024.**3) mem_bytes = os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')
pool_size = min(16,max(int(mem_gib // 3), 1)) mem_gib = mem_bytes/(1024.**3)
LOG.i(f"Total mem: {mem_gib:.2f}GB, using {pool_size} procs for compiling.") pool_size = min(16,max(int(mem_gib // 3), 1))
LOG.i(f"Total mem: {mem_gib:.2f}GB, using {pool_size} procs for compiling.")
except ValueError:
# On macOS, python with version lower than 3.9 do not support SC_PHYS_PAGES.
# Use hard coded pool size instead.
pool_size = 4
LOG.i(f"using {pool_size} procs for compiling.")
p = Pool(pool_size, initializer=pool_initializer) p = Pool(pool_size, initializer=pool_initializer)
p.__enter__() p.__enter__()
import atexit import atexit
@ -215,7 +228,7 @@ def find_cache_path():
for name in cache_name.split("/"): for name in cache_name.split("/"):
dirs.insert(-1, name) dirs.insert(-1, name)
os.environ["cache_name"] = cache_name os.environ["cache_name"] = cache_name
LOG.v("cache_name", cache_name) LOG.v("cache_name: ", cache_name)
for d in dirs: for d in dirs:
path = os.path.join(path, d) path = os.path.join(path, d)
if not os.path.isdir(path): if not os.path.isdir(path):
@ -237,7 +250,10 @@ def get_version(output):
if len(v) == 0: if len(v) == 0:
v = re.findall("[0-9]+\\.[0-9]+", version) v = re.findall("[0-9]+\\.[0-9]+", version)
assert len(v) != 0, f"Can not find version number from: {version}" assert len(v) != 0, f"Can not find version number from: {version}"
version = "("+v[-1]+")" if 'clang' in version and platform.system() == 'Darwin':
version = "("+v[-3]+")"
else:
version = "("+v[-1]+")"
return version return version
def get_int_version(output): def get_int_version(output):
@ -286,10 +302,21 @@ cc_type = get_cc_type(cc_path)
cache_path = find_cache_path() cache_path = find_cache_path()
# Search python3.x-config
# Note:
# This may be called via c++ console. In that case, sys.executable will
# be a path to the executable file, rather than python. So, we cannot infer
# python-config path only from sys.executable.
# To address this issue, we add predefined paths to search,
# - Linux: /usr/bin/python3.x-config
# - macOS (installed via homebrew): /usr/local/bin/python3.x-config
# There may be issues under other cases, e.g., installed via conda.
py3_config_paths = [ py3_config_paths = [
os.path.dirname(sys.executable) + f"/python3.{sys.version_info.minor}-config", os.path.dirname(sys.executable) + f"/python3.{sys.version_info.minor}-config",
sys.executable + "-config", sys.executable + "-config",
f"/usr/bin/python3.{sys.version_info.minor}-config", f"/usr/bin/python3.{sys.version_info.minor}-config",
f"/usr/local/bin/python3.{sys.version_info.minor}-config",
f'/opt/homebrew/bin/python3.{sys.version_info.minor}-config',
os.path.dirname(sys.executable) + "/python3-config", os.path.dirname(sys.executable) + "/python3-config",
] ]
if "python_config_path" in os.environ: if "python_config_path" in os.environ:
@ -302,4 +329,4 @@ else:
raise RuntimeError(f"python3.{sys.version_info.minor}-config " raise RuntimeError(f"python3.{sys.version_info.minor}-config "
f"not found in {py3_config_paths}, please specify " f"not found in {py3_config_paths}, please specify "
f"enviroment variable 'python_config_path'," f"enviroment variable 'python_config_path',"
f" or apt install python3.{sys.version_info.minor}-dev") f" or install python3.{sys.version_info.minor}-dev")

View File

@ -1,4 +1,5 @@
import os import os
import platform
import sys import sys
import jittor_utils import jittor_utils
from jittor_utils import LOG from jittor_utils import LOG
@ -27,10 +28,20 @@ if __name__ == "__main__":
s += " -I"+os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "jittor", "src")) s += " -I"+os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "jittor", "src"))
s += " " s += " "
elif arg == "--libs-flags": elif arg == "--libs-flags":
libbase = "/usr/lib/x86_64-linux-gnu" libext = {
libpath = libbase + f"/lib{base}.so" 'Linux': 'so',
assert os.path.isfile(libpath), f"lib not exist: {libpath}" 'Darwin': 'dylib',
s += f" -L{libbase} -l{base} -ldl " 'Windows': 'DLL',
}[platform.system()]
ldflags = jittor_utils.run_cmd(jittor_utils.py3_config_path + " --ldflags")
libpaths = [l[2:] for l in ldflags.split(' ') if l.startswith("-L")]
for libbase in libpaths:
libpath = os.path.join(libbase, f"lib{base}.{libext}")
if os.path.isfile(libpath):
s += f" -L{libbase} -l{base} -ldl "
break
else:
raise RuntimeError("Python dynamic library not found")
elif arg == "--cxx-flags": elif arg == "--cxx-flags":
s += " --std=c++17 " s += " --std=c++17 "
elif arg == "--cxx-example": elif arg == "--cxx-example":

View File

@ -1,13 +1,13 @@
error_msg = """Jittor only supports Ubuntu>=16.04 currently. error_msg = """Jittor only supports Linux and macOS currently.
For other OS, use Jittor may be risky. For other OS, use Jittor may be risky.
If you insist on installing, please set the environment variable : export FORCE_INSTALL=1 If you insist on installing, please set the environment variable : export FORCE_INSTALL=1
We strongly recommended docker installation: We strongly recommend docker installation:
# CPU only(Linux) # CPU only (Linux)
>>> docker run -it --network host jittor/jittor >>> docker run -it --network host jittor/jittor
# CPU and CUDA(Linux) # CPU and CUDA (Linux)
>>> docker run -it --network host jittor/jittor-cuda >>> docker run -it --network host jittor/jittor-cuda
# CPU only(Mac and Windows) # CPU only (Mac and Windows)
>>> docker run -it -p 8888:8888 jittor/jittor >>> docker run -it -p 8888:8888 jittor/jittor
Reference: Reference:
@ -15,19 +15,10 @@ Reference:
""" """
from warnings import warn from warnings import warn
import os import os
try: import platform
with open("/etc/os-release", "r", encoding='utf8') as f:
s = f.read().splitlines() if not platform.system() in ['Linux', 'Darwin']:
m = {} assert os.environ.get("FORCE_INSTALL", '0') != '1', error_msg
for line in s:
a = line.split('=')
if len(a) != 2: continue
m[a[0]] = a[1].replace("\"", "")
# assert m["NAME"] == "Ubuntu" and float(m["VERSION_ID"].split('.')[0])>=16, error_msg
except Exception as e:
print(e)
warn(error_msg)
if os.environ.get("FORCE_INSTALL", '0') != '1': raise
import setuptools import setuptools
from setuptools import setup, find_packages from setuptools import setup, find_packages