Giter VIP home page Giter VIP logo

tacc / gravit Goto Github PK

View Code? Open in Web Editor NEW
17.0 25.0 8.0 205.76 MB

GraviT is a distributed ray tracing framework that enables applications to leverage hardware-optimized ray tracers within a single environment across many nodes for large-scale rendering tasks.

Home Page: http://tacc.github.io/GraviT/

License: Other

CMake 8.33% C++ 83.08% C 1.37% Shell 0.92% Cuda 2.54% Python 3.76%
distributed raytracing gpu-raytracing cpu-raytracing software-defined-visualization

gravit's Introduction

GraviT: A Comprehensive Ray Tracing Framework for Visualization in Distributed-Memory Parallel Environments

Find GraviT on the TACC GitHub site!

Building GraviT

GraviT uses the CMake build system to configure the build environment and make to perform the actual build. There are a number of libraries on which GraviT depends, which all are provided in the third-party subdirectory, either as git submodules or as direct insertions into the repository.

The sequence below should provide a basic GraviT build for recent Linux flavors and for recent MacOS versions, provided that all requirements for the dependencies are also present (in particular, Qt4 and a version doxygen with graphviz support must be installed). Please note that the GraviT CMake should find third-party dependencies installed to third-party/<dependency>/install, but the dependencies themselves may need help (e.g. Embree and OSPRay finding ispc). If you encounter any issues, please file a issue on GitHub.

git clone https://github.com/TACC/GraviT.git
cd GraviT
git submodule init
git submodule update
cd third-party/ispc
./get-ispc.sh <os>      # where os: [ linux | osx ]
# build embree, install to `third-party/embree/install`
cd ../embree
# note that the path to ISPC will need to be adjusted
# depending on your OS
cmake -DCMAKE_PREFIX_PATH=../ispc/ispc-v1.9.2-osx -DCMAKE_INSTALL_PREFIX:PATH=$PWD/install .
make install
cd ../GregSpray         # a TACC-specific fork of OSPRay that enables ray communication
# build GregSpray / OSPRay, install to `third-party/GregSpray/install`
embree_DIR=../embree cmake -DTBB_LIBRARY_DEBUG=/usr/local/lib/libtbb.dylib -DTBB_LIBRARY_MALLOC_DEBUG=/usr/local/lib/libtbbmalloc.dylib -DCMAKE_PREFIX_PATH=../ispc/ispc-v1.9.2-osx -DCMAKE_INSTALL_PREFIX:PATH=$PWD/install -DOSPRAY_MODULE_OPENGL_UTIL=True -DOSPRAY_USE_EXTERNAL_EMBREE=True -DCMAKE_BUILD_TYPE=Release .
make install
# build icet, install to `third-party/icet/install`
cd ../icet
cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/install -DBUILD_SHARED_LIBS=True .
make install
cd ../..
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/../install ../
# configure GraviT
make && make install

Building with volume rendering support

Currently volume rendering support must be enabled at compile time. Rather than using the default cmake flags, instead build GraviT with the following cmake invocation:

embree_DIR=../third-party/embree cmake -DGVT_VOLUME=True -DGVT_RENDER_ADAPTER_GALAXY=True -DGVT_VOL_APP=True -DGVT_TIMING=False -DGVT_TESTING=False -DGVT_RENDER_ADAPTER_EMBREE=False -DGVT_RENDER_ADAPTER_EMBREE_STREAM=False -DCMAKE_INSTALL_PREFIX:PATH=$PWD/../install ../

This turns on several compile-time flags needed by the volume renderer and disables the testing option, which currently conflicts with the volume renderer.

Building the Python interface

Once you have build GraviT itself, you can optionally build the python bindings to GraviT, pygvt. To build them, navigate to the pygvt folder and build the cython wrapper around the GraviT C++ API:

cd pygvt
embree_DIR=../third-party/embree/install gvt_DIR=../install/ IceT_LIB_DIR=../third-party/icet/install/lib MPI_DIR=/usr/local/ Galaxy_LIB_DIR=../third-party/galaxy/install/lib python setup.py develop

If you would prefer to avoid setting these environment variables at the command line manually, you can source the setenv.sh script instead.

You will need cython and setuptools installed in your python environment for this to work correctly. In addition, this assumes you have an MPI installation in /usr/local/ If your local MPI installation is in a different place, adjust MPI_DIR.

Now you should be able to run the volume rendering example included with the GraviT repository:

LD_LIBRARY_PATH=../install/lib:../third-party/icet/install/lib:../third-party/embree/install/lib:../third-party/galaxy/install/lib mpirun -np 2 python gvtVol.py

This will produce an image named PythonVolRenderer.ppm in the current directory.

Design Philosophy

GraviT is a software library for the class of simulation problems where insight is derived from actors operating on scientific data, i.e., data that has physical coordinates. This data is often so large that it cannot reside in the memory of a single compute node. While GraviT is designed with many types of actors and use cases in mind, the canonical usage of GraviT is with the actors that are rays and data that are tessellated surfaces. In this case, GraviT produces ray-traced renderings.

GraviT’s design focuses on three key elements: interface, scheduler, and engine. The interface element is how users interact with GraviT. The scheduler element focuses on how to bring together actors with the appropriate pieces of data to advance the calculation. The engine element performs the specified operations of the actor upon the data. This design is intentionally modular: developers can opt to extend GraviT with their own implementations of interface, scheduler, or engine, and to re-use the implementations from the other areas. In short, GraviT provides a fully working system, but also one that can be easily extended. Finally, GraviT is intended for very computationally heavy problems, so it aims to carry out calculations in the most efficient way possible while maintaining modularity and generality. This goal impacts the scheduler and engine elements in particular.

GraviT is divided into “core” infrastructure and domain-specific library. The “core” infrastructure, abbreviated GVT-Core, contains abstract types, as well as implementations that are common to domain-specific libraries, for example scheduling. The domain-specific libraries build on GVT-Core to create a functional system that is specialized to their area. At present, GVT-Render, for ray-tracing geometric surfaces and for volume rendering, is the only specialization implemented, though others are on the long-term roadmap.

Engines

GraviT’s engines are the modules that carry out the calculation to advance an actor using information from the appropriate data. The choice of the word “engine” conveys a connotation that this operation is computationally intensive, and this is purposeful. GraviT is aimed at problems where determining the behavior of an actor is time-intensive because (1) there are many actors, (2) the data is very large, or (3) both. Building high-quality engines takes significant development time. Fortunately, existing third-party products can fill this role in key instances. GraviT’s development strategy is inclusive of these third-party products, and provides options for leveraging them. For these cases, the GraviT engine acts as an adapter, converting requests from scheduler into instructions that the third-party product can accept. At this time, the third-party products most considered by the GraviT team are Intel’s Embree/OSPRay and NVIDIA’s Optix Prime/Optix. These libraries are being used for GVT-Render for geometry and volume rendering (where supported).

Interfaces

GraviT’s interface is how external applications interact with GraviT. GraviT has a single interface, and all domain-specific applications use this interface. The interface is key-based, which means that each must specify its set of supported keys, and document that list for library users. (For example, GVT-Render will support the notion of a camera position, and its documentation must make clear that the key associated with this position is “Camera”, as opposed to “CamPosition”.) One motivation behind this design is the code for the interface can be written once, and re-used for each domain-specific application, modulo defining the sets of keys that are used.

Beyond the general interface, new interfaces to GraviT can added as wrappers around the main interface. These interfaces will define their own library functions, and implement the functions by translating the incoming information to the main GraviT interface. One reason to define a new, wrapper interface is to simplify the interface for users, i.e., to reduce barriers to community usage. Another reason is to fit a legacy interface, once again to reduce barriers to community usage. An example of this latter type exists in GVT-Render, which provides a GLuRay interface. The GLuRay interface meets the OpenGL 1.x standards, which is used by multiple visualization tools, and thus allows them to use GraviT with minimal overhead. The GLuRay wrapper interface then implements its functions by calling functions in the main GraviT interface.

GraviT’s interface also sometimes needs to affect application behavior. This is done through callbacks. Applications can register callbacks to load or unload data with GraviT, and GraviT’s schedule can issue these callbacks while it is executing.

Data Model

GraviT’s data model varies from domain-specific library to domain-specific library. The application callbacks to load data need to be aware of the data model of the domain-specific library to load it into GraviT’s form. Our team has discussed issues such as “zero-copy” in situ, but this discussion has not yet led to a fixed model. As this issue is large in scope, our short-term plan appears to be that we make a copy of the data in GraviT’s format.

GraviT does not only accept data through load and unload callbacks. Applications can specify the data before execution starts. This is the case with GLuRay, where data is acquired incrementally through its interface, and then registered with the scheduler. Scheduler

The job of GraviT’s scheduler is to get actor and data together so that an engine can carry out its operations. When GraviT runs in a distributed-memory parallel setting, getting the right actor and data together can have significant latency. There is a spectrum of algorithms that respond to this issue. On one extreme, actors stay on the same node throughout execution, and the needed data is imported to carry out execution. On the other extreme, data stays on the same node throughout execution, and actors are passed around between nodes.

Our goal with the GraviT schedulers is that we develop building blocks to facilitate rapid development of new schedulers. We endeavor to have schedulers that take approximately forty lines of code, and who’s implementations highly resemble the pseudocode we would use to describe them in a publication.

GraviT does make assumptions about the data it operates on. Specifically, it assumes that data that is very large can be decomposed into domains, i.e., partitioning the set of all data so that each domain is spatially contiguous. Further, GraviT’s schedulers assume that they can access information about: (1) the spatial extents of each domain and (2) the cost of acquiring each domain. These requirements are important for enabling schedulers to perform efficiently.

gravit's People

Contributors

applekey avatar hyungman avatar jgbarbosa avatar pnav avatar rbrtribeiro avatar scottre avatar semeraro avatar srinathv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gravit's Issues

Seg fault running the gvtVol app on MacOS

I built GraviT with the following options:

GVT_VOLUME True
GVT_RENDER_ADAPTER_GREGSPRAY True
GVT_VOL_APP True
GVT_TIMING False
GVT_TESTING False

When running the gvtVol app with the following invocation:

LD_LIBRARY_PATH=./lib:../third-party/GregSpray/install/lib bin/gvtVol -volfile ../data/vol/int2.bov -domain -ctffile ../data/colormaps/Grayscale.orig.cmap -otffile ../data/colormaps/Grayscale.orig.omap -wsize 512,512 -eye 512,512,512 -look 127.5,127.5,127.5 -upVector 0,0,1 -imagefile supertest -threads 8 >spoot.out

(as suggested by @semeraro on Slack) I get a segmentation fault with the following traceback:

[ROUS:51740] *** Process received signal ***
[ROUS:51740] Signal: Segmentation fault: 11 (11)
[ROUS:51740] Signal code:  (0)
[ROUS:51740] Failing at address: 0x0
[ROUS:51740] [ 0] 0   libsystem_platform.dylib            0x00007fff6c0e8f5a _sigtramp + 26
[ROUS:51740] [ 1] 0   ???                                 0x000000011d2e8088 0x0 + 4784554120
[ROUS:51740] [ 2] 0   mca_pml_ob1.so                      0x0000000113871d38 mca_pml_ob1_iprobe + 127
[ROUS:51740] [ 3] 0   libmpi.20.dylib                     0x000000010f5f18c1 MPI_Iprobe + 279
[ROUS:51740] [ 4] 0   gvtVol                              0x000000010f529577 _ZN3gvt4comm5scomm3runEv + 279
[ROUS:51740] [ 5] 0   gvtVol                              0x000000010f529421 _ZN3tbb8internal13function_taskIZN3gvt4comm12communicator4initEiPPcbE3$_0E7executeEv + 17
[ROUS:51740] [ 6] 0   libtbb.dylib                        0x000000010f6dbb38 _ZN3tbb8internal16custom_schedulerINS0_20IntelSchedulerTraitsEE18local_wait_for_allERNS_4taskEPS4_ + 708
[ROUS:51740] [ 7] 0   libtbb.dylib                        0x000000010f6d665e _ZN3tbb8internal5arena7processERNS0_17generic_schedulerE + 272
[ROUS:51740] [ 8] 0   libtbb.dylib                        0x000000010f6d604c _ZN3tbb8internal6market7processERN3rml3jobE + 66
[ROUS:51740] [ 9] 0   libtbb.dylib                        0x000000010f6d23a3 _ZN3tbb8internal3rml14private_worker3runEv + 175
[ROUS:51740] [10] 0   libtbb.dylib                        0x000000010f6d22ef _ZN3tbb8internal3rml14private_worker14thread_routineEPv + 9
[ROUS:51740] [11] 0   libsystem_pthread.dylib             0x00007fff6c0f26c1 _pthread_body + 340
[ROUS:51740] [12] 0   libsystem_pthread.dylib             0x00007fff6c0f256d _pthread_body + 0
[ROUS:51740] [13] 0   libsystem_pthread.dylib             0x00007fff6c0f1c5d thread_start + 13
[ROUS:51740] *** End of error message ***
[1]    51740 segmentation fault  LD_LIBRARY_PATH=./lib:../third-party/GregSpray/install/lib bin/gvtVol -volfil

I'm able to demangle the first entry in gvtVol in the traceback to gvt::comm::scomm::run() but was not able to demangle _ZN3tbb8internal13function_taskIZN3gvt4comm12communicator4initEiPPcbE3$_0E7executeEv

pygvt assumes it's being built with the intel compilers

The pygvt setup.py file adds irc and irf to the list of libraries to link against. This is problematic if you are trying to build pygvt on a system that does not have the intel compilers installed. See

GraviT/pygvt/setup.py

Lines 80 to 81 in cf8e829

"irc",
"imf",

I've removed these two libraries in my local copy of pygvt but am unsure of a more generic fix. I guess we need to somehow detect that someone is trying to build with the intel compilers and add the intel runtime libraries then.

GregSpray fails to install

OK, I got past the build issue in #11 and was able to successfully build GregSpray. Now when I try to install I get the following error:

$ make install
[  3%] Built target ospray_common
[ 49%] Built target ospray
[ 50%] Built target ospTutorialC
[ 51%] Built target ospTutorial
[ 52%] Built target ospray_module_opengl_util
[ 53%] Built target ospray_xml
[ 55%] Built target ospray_importer
[ 56%] Built target ospray_tfn
[ 60%] Built target ospray_minisg
[ 64%] Built target ospray_commandline
[ 66%] Built target ospCvtParaViewTfcn
[ 66%] Built target ospray_script
[ 67%] Built target ospBenchmark
[ 69%] Built target ospray_glut3d
[ 70%] Built target ospGlutViewer
[ 79%] Built target ospray_sg
[ 85%] Built target ospQtViewer
[100%] Built target ospVolumeViewer
Install the project...
-- Install configuration: "Release"
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/ospray.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/OSPExternalRays.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/OSPDataType.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/OSPTexture.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/share/doc/OSPRay/LICENSE.txt
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/share/doc/OSPRay/CHANGELOG.md
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/share/doc/OSPRay/README.md
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/lib/libembree.2.16.5.dylib
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/OSPConfig.h
-- Installing: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/lib/libospray_common.1.1.2.dylib
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/lib/libospray_common.0.dylib
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/lib/libospray_common.dylib
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/AffineSpace.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/box.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/common.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/constants.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/FileName.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/intrinsics.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/library.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/LinearSpace.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/malloc.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/math.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/platform.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/Quaternion.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/RefCount.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/sysinfo.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/thread.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/include/ospray/SDK/../ospcommon/vec.h
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/lib/libtbb.dylib
-- Up-to-date: /Users/goldbaum/Documents/GraviT/third-party/GregSpray/install/lib/libtbbmalloc.dylib
CMake Error at builddir/ospray/intel64/cmake_install.cmake:36 (file):
  file INSTALL cannot find
  "/Users/goldbaum/Documents/GraviT/third-party/GregSpray/ospray/TBB_LIBRARY_DEBUG-NOTFOUND".
Call Stack (most recent call first):
  cmake_install.cmake:66 (include)

Perhaps I needed to install the TBB library before building Embree? I built Embree from source using the submodule in the GraviT repo.

Trouble compiling GregSpray

I'm trying to follow the instructions for building GraviT on the dev branch, but am hitting issues while trying to compile GregSpray:

My cmake invocation looks like:

embree_DIR=../embree cmake -DCMAKE_PREFIX_PATH=../ispc/ispc-v1.9.2-osx -DCMAKE_INSTALL_PREFIX:PATH=$PWD/install -DOSPRAY_MODULE_OPENGL_UTIL=True -DOSPRAY_USE_EXTERNAL_EMBREE=True .

And here's the output I see: https://gist.github.com/ngoldbaum/49043a3aa62648a9976f87a7d5e3cfcd

The error text is:

CMake Error at cmake/ospray_macros.cmake:168 (ADD_SUBDIRECTORY):
  ADD_SUBDIRECTORY given source "modules" which is not an existing directory.
Call Stack (most recent call first):
CMakeLists.txt:65 (OSPRAY_ADD_SUBDIRECTORY)

I tried creating a modules directory in the root of GregSpray but that led to the following error:

CMake Error at cmake/ospray_macros.cmake:168 (ADD_SUBDIRECTORY):
  The source directory

    /Users/goldbaum/Documents/GraviT/third-party/GregSpray/modules

  does not contain a CMakeLists.txt file.
Call Stack (most recent call first):
  CMakeLists.txt:65 (OSPRAY_ADD_SUBDIRECTORY)

Unfortunately I'm pretty unfamiliar with cmake so I'm not sure where to go from here.

Failed assertion using pygvt

When I run test.py in the repo, using the latest version of the dev branch, I get the following output:

Create instance Cone0
Create instance Cube1
Create instance Cone2
Create instance Cube3
Create instance Cone4
Create instance Cube5
Create instance Cone6
Create instance Cube7
Create instance Cone8
Create instance Cone9
Create instance Cube10
Create instance Cone11
Create instance Cube12
Create instance Cone13
Create instance Cube14
Create instance Cone15
Create instance Cube16
Create instance Cone17
Create instance Cube18
Create instance Cone19
Create instance Cone20
Create instance Cube21
Create instance Cone22
Failed assertion `false [gvt/core/context/Database.cpp : 222]: Pointer used in marsh

This is happening in the call to render, here:

gvt.render("render");

Unable to build GraviT on Linux with GNU toolchain

Currently the build is failing with the following output: https://gist.github.com/ngoldbaum/8a0c53ca94b03b2e6b1af61dcc5dc636

One concrete issue I see in the output is this:

/home/goldbaum/GraviT/src/gvt/render/actor/Ray.h:149:17: error: member 'glm::vec3 gvt::render::actor::Ray::<anonymous union>::<anonymous struct>::origin' with constructor not allowed in anonymous aggregate

Apparently gcc doesn't like anonymous structs with constructors. There also appear to be a large number of template-related errors.

Add project description

The only description right now is in the readme, so it's not going to be found by GitHub searches.

pygvt looks for mpicxx library but OpenMPI provides mpi_cxx

pygvt fails to build on my setup with the following error:

clang++ -bundle -undefined dynamic_lookup build/temp.macosx-10.12-x86_64-3.6/src/gvt/gvt.o -L/Users/goldbaum/Documents/embree-2.17.0.x86_64.macosx/lib -L/usr/local/lib/lib64 -L/usr/local/lib -L/usr/local/lib/lib -L/Users/goldbaum/Documents/iceT/lib -lgvtRender -lgvtCore -lIceTGL -lIceTMPI -lIceTCore -lembree -lboost_system-mt -lmpi -lmpicxx -o /Users/goldbaum/Documents/GraviT/pygvt/gvt.cpython-36m-darwin.so -std=c++11 -mmacosx-version-min=10.11 -stdlib=libc++
ld: warning: directory not found for option '-L/usr/local/lib/lib64'
ld: warning: directory not found for option '-L/usr/local/lib/lib'
ld: library not found for -lmpicxx

I was able to fix this locally by replacing mpicxx in the pygvt setup.py file with mpi_cxx.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.