Giter Site home page Giter Site logo

intel / media-delivery Goto Github PK

View Code? Open in Web Editor NEW
92.0 8.0 29.0 3.65 MB

This collection of samples demonstrates best practices to achieve optimal video quality and performance on Intel GPUs for content delivery networks. Check out our demo, recommended command lines and quality and performance measuring tools.

License: MIT License

Shell 51.15% Python 20.31% CMake 1.44% M4 15.51% Dockerfile 11.60%
docker ffmpeg msdk nginx qsv hls cdn vod

media-delivery's Introduction

Media Delivery Software Stack

Intel GPUs have dedicated hardware that enables fast, energy-efficient encoding and decoding of video compliant with the industry standards such as H.264, HEVC and AV1. Drivers and software enable application developers to utilize this hardware either directly from their own applications or from within popular frameworks such as FFmpeg and GStreamer.

This repository curates a coherent set of software, drivers and utilities to assist users who are getting started with transcoding video on Intel GPUs so that they can begin evaluating performance and incorporating Intel GPU transcode acceleration into their applications.

Included here are scripts, Docker configurations and documents that provide:

We recommend to attach GPU of Intel® Data Center GPU Flex Series to the system with the following characteristics:

  Recommendation
CPU 3rd Generation Intel® Xeon® Scalable Processors
Storage At least of 20GB of free disk space available for docker
Operating System(s) Ubuntu 20.04 or Ubuntu 22.04 with kernel mode support as described here

GPU of Intel® Arc™ A-Series Graphics should be attached to the system with the following requirements:

  Recommendation
CPU

One of the following CPUs:

Storage At least of 20GB of free disk space available for docker
Operating System(s) Ubuntu 20.04 or Ubuntu 22.04 with kernel mode support as described here

To run upstream GPU products, i.e. those GPUs support for which is available in Linux distributions, you need:

  Recommendation
Operating System(s) Linux distribution capable to support your GPU. We recommend Ubuntu 20.04 or later.
Storage At least of 20GB of free disk space available for docker

We provide dockerfiles to setup transcoding environment. These dockerfiles need to be built into docker containers. Dockerfiles can also be used as a reference instruction to install ingredients on bare metal.

If you want to run in virtual environment, first follow instruction given in GPU virtualization setup guide and then proceed with the setup described below.

Docker is required to build and to run media delivery containers. If you run Ubuntu 20.04 or later you can install it as follows:

sudo apt-get install docker.io

You might need to further configure docker on your system:

  • Allow docker to run under your user account (remember to relogin for group modification to take effect):

    sudo usermod -aG docker $(whoami) && exit
    
  • Consider to register and login to Docker Hub. Docker Hub limits the number of docker image downloads ("pulls"). For anonymous users this limit is tied to IP address. For authenticated users it depends on subscription type. For details see https://docs.docker.com/docker-hub/download-rate-limit/. To authenticate running docker engine, execute:

    # you will be prompted to enter username and password:
    docker login
    
  • If you run behind a proxy, configure proxies for for docker daemon. Refer to https://docs.docker.com/config/daemon/systemd/. Below example assumes that you have http_proxy environment variable set in advance:

    sudo mkdir -p /etc/systemd/system/docker.service.d
    echo "[Service]" | sudo tee /etc/systemd/system/docker.service.d/https-proxy.conf
    echo "Environment=\"HTTPS_PROXY=$http_proxy/\"" | \
      sudo tee -a /etc/systemd/system/docker.service.d/https-proxy.conf
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    sudo systemctl show --property=Environment --no-pager docker
    
  • Make sure that docker has at least 20GB of hard disk space to use. To check available space run (in the example below 39GB are available):

    $ df -h $(docker info -f '{{ .DockerRootDir}}')
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        74G   32G   39G  46% /
    

    If disk space is not enough (for example, default /var/lib/docker is mounted to a small size partition which might be a case for /var), consider reconfiguring docker storage location as follows:

    # Below assumes unaltered default docker installation when
    # /etc/docker/daemon.json does not exist
    echo "{\"data-root\": \"/mnt/newlocation\"}" | sudo tee /etc/docker/daemon.json
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

We provide few different setup configurations which differ by versions and origins of the included Intel media stack components. Some versions of media stack require special setup for the host.

Dockerfile Intel media stack origin Supported Intel GPUs Host setup instructions
docker/ubuntu20.04/selfbuild-prodkmd/Dockerfile Self-built from open source Alchemist, ATS-M Intel GPU DKMS
docker/ubuntu20.04/selfbuild/Dockerfile Self-built from open source Gen8+ (legacy upstreamed platforms), such as SKL, KBL, CFL, TGL, DG1, etc. Use any Linux distribution which supports required platform
docker/ubuntu20.04/native/Dockerfile Ubuntu 20.04 Gen8+, check Ubuntu 20.04 documentation Use any Linux distribution which supports required platform

To build any of the configurations, first clone Media Delivery repository:

git clone https://github.com/intel/media-delivery.git && cd media-delivery

To build configuration which targets DG2/ATS-M stack self-built from open source projects, run:

docker build \
  $(env | grep -E '(_proxy=|_PROXY)' | sed 's/^/--build-arg /') \
  --file docker/ubuntu20.04/selfbuild-prodkmd/Dockerfile \
  --tag intel-media-delivery .

To build configuration which targets Gen8+ legacy upstreamed platforms via stack self-built from open source projects, run:

docker build \
  $(env | grep -E '(_proxy=|_PROXY)' | sed 's/^/--build-arg /') \
  --file docker/ubuntu20.04/selfbuild/Dockerfile \
  --tag intel-media-delivery .

Docker containers provide isolated environments with configured software. To access resources on a host system you need to add specific options when starting docker containers. Overall, software included into media-delivery constainers requires the following:

  • To access desired GPU you need to map it to the container, see --device option below
  • To be able to access performance metrics, you need --cap-add SYS_ADMIN
  • To access ngingx server (if you are running a demo), you need to forward 8080 port, see -p 8080:8080

Summarizing, start container as follows (-v option maps a host folder to the container so you can copy transcoded streams back to the host):

DEVICE=${DEVICE:-/dev/dri/renderD128}
DEVICE_GRP=$(stat --format %g $DEVICE)
mkdir -p /tmp/media-delivery && chmod -R 777 /tmp/media-delivery
docker run --rm -it -v /tmp/media-delivery:/opt/media-delivery \
  -e DEVICE=$DEVICE --device $DEVICE --group-add $DEVICE_GRP \
  --cap-add SYS_ADMIN \
  -p 8080:8080 \
  intel-media-delivery

Once inside a container you can run the included software and scripts. To start, we recommend running simple scripts which will showcase basic transcoding capabilities. These scripts will download sample video clips, though you can supply your own as a script argument if needed. If you work under proxy do not forget to add it to your environment (via export https_proxy=<...>).

  • Below commands will run single transcoding session (1080p or 4K) and produce output files which you can copy to the host and review:

    # AV1 to AV1:
    ffmpeg-qsv-AV1-1080p.sh 1
    ffmpeg-qsv-AV1-4K.sh 1
    sample-multi-transcode-AV1-1080p.sh 1
    sample-multi-transcode-AV1-4K.sh 1
    
    # AVC to AVC:
    ffmpeg-qsv-AVC-1080p.sh 1
    ffmpeg-qsv-AVC-4K.sh 1
    sample-multi-transcode-AVC-1080p.sh 1
    sample-multi-transcode-AVC-4K.sh 1
    
    # HEVC to HEVC
    ffmpeg-qsv-HEVC-1080p.sh 1
    ffmpeg-qsv-HEVC-4K.sh 1
    sample-multi-transcode-HEVC-1080p.sh 1
    sample-multi-transcode-HEVC-4K.sh 1
    
  • Below commands will run specified number of parallel transcoding sessions (1080p or 4K). No output files will be produced, but you can check performance. Mind that below numbers of parallel transcoding sessions are suggested for Intel® Data Center GPU Flex Series. Other GPUs might support different number of sessions running at realtime:

    # AV1 to AV1:
    ffmpeg-qsv-AV1-1080p.sh 16
    ffmpeg-qsv-AV1-4K.sh 4
    sample-multi-transcode-AV1-1080p.sh 16
    sample-multi-transcode-AV1-4K.sh 4
    
    # AVC to AVC:
    ffmpeg-qsv-AVC-1080p.sh 12
    ffmpeg-qsv-AVC-4K.sh 2
    sample-multi-transcode-AVC-1080p.sh 12
    sample-multi-transcode-AVC-4K.sh 2
    
    # HEVC to HEVC
    ffmpeg-qsv-HEVC-1080p.sh 16
    ffmpeg-qsv-HEVC-4K.sh 4
    sample-multi-transcode-HEVC-1080p.sh 16
    sample-multi-transcode-HEVC-4K.sh 4
    

These scripts run transcoding command lines which we recommend to use for best performance and quality in case of Random Access encoding. See reference command lines for details.

In addition to the simple scripts described above, this project provides the following scripts and software which can be tried next:

For the more complex samples, check out Open Visual Cloud and their full scale CDN Transcode Sample.

Intel® Deep Link Hyper Encode Technology was designed to boost transcode performance to achieve 8K60 real-time throughput. Currently supported via Sample Multi Transcode application, this technology was tested on Intel® Data Center GPU Flex 140 card (2 GPU nodes). Media delivery container can be used to check two different flavors of this approach:

  • 1 GPU node solution (encoder and decoder workloads are shared between 2 VDBOX engines of a single GPU node and encoding is parallelized on a GOP level)
  • 2 GPU node solution (encoder and decoder workloads use 4 VDBOX engines of 2 GPU nodes and encoding is parallelized on a GOP level)

Simple example scripts are provided allowing for a quick test of 8k60 transcoding at the user’s end. First, start docker with mapping multiple GPU nodes (mind --device /dev/dri vs --device $DEVICE as in previous examples) as follows:

DEVICE=${DEVICE:-/dev/dri/renderD128}
DEVICE_GRP=$(stat --format %g $DEVICE)
mkdir -p /tmp/media-delivery && chmod -R 777 /tmp/media-delivery
docker run --rm -it -v /tmp/media-delivery:/opt/media-delivery \
  -e DEVICE=$DEVICE --device /dev/dri --group-add $DEVICE_GRP \
  --cap-add SYS_ADMIN \
  -p 8080:8080 \
  intel-media-delivery

Once inside the container, simple scripts can be used to showcase Intel® Deep Link Hyper Encode Technology. If you work behind a firewall, please add HTTPS proxy to your environment (via export https_proxy=<...>) before running the scripts.

  • Use the following commands to run single 8K transcoding session using either of the two flavors:

    # AV1 to AV1:
    sample-multi-transcode-AV1-8K-hyperenc1gpu.sh
    sample-multi-transcode-AV1-8K-hyperenc2gpu.sh
    
    # HEVC to HEVC
    sample-multi-transcode-HEVC-8K-hyperenc1gpu.sh
    sample-multi-transcode-HEVC-8K-hyperenc2gpu.sh
    

More information on Intel® Deep Link Hyper Encode Technology can be found here:

Feedback and contributions are welcome. Please, submit issues and pull requests here at GitHub.

Dockerfiles should be supported as described in the document.

If changes are done to dockerfiles and/or scipts, please, make sure to run tests before submitting pull requests.

Container image comes with some embedded content attributed as follows:

/opt/data/embedded/WAR_TRAILER_HiQ_10_withAudio.mp4:
  Film: WAR - Courtesy & Copyright: Yash Raj Films Pvt. Ltd.

Inside the container, please, refer to the following file:

cat /opt/data/embedded/usage.txt

media-delivery's People

Contributors

chandler-brown avatar dmillar1 avatar dpatel257 avatar dsocek avatar dvrogozh avatar eero-t avatar jamesiwan avatar jianshui avatar kjgayath avatar mkpatel3-github avatar rdower avatar softworkz avatar sunithabhooshanam avatar

Stargazers

 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  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  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  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

media-delivery's Issues

Recommend PERFMON capability instead of SYS_ADMIN

In: https://github.com/intel/media-delivery/blob/master/doc/howto.rst

You state:
"Such metrics require CAP_SYS_ADMIN or /proc/sys/kernel/perf_event_paranoid<=0 to be collected."

I would would suggest replacing that with:
"Such metrics require PERFMON capability or /proc/sys/kernel/perf_event_paranoid<=0 to be collected. On older kernels and container runtime versions which are lacking support for the PERFMON capability, SYS_ADMIN capability needs to be used instead."

(Because SYS_ADMIN capability grants too wide range of privileges, kernel/security folks are replacing its use with finer-grained capabilities.)

As long PERFMON is mentioned, I think it's fine to use CAP_SYS_ADMIN in your usage examples, because there are still a lot of setups that do not support PERFMON capability yet.

Fix shellcheck warnings in the scripts

Pre-condition:

  • sudo apt install shellcheck or dnf install shellcheck

There are quite a few shell scripts:

find -name '*.*sh' | wc -l
38

And they trigger a lot of shellcheck warnings:

find -name '*.*sh' | xargs shellcheck | grep SC[0-9]*: | wc -l
658

Note: one should not follow shellcheck recommendations blindly. Main one where one could screw up is changing this:

base_opts="-a -b -c"
command $base_opts -d -e -f

To:

base_opts="-a -b -c"
command "$base_opts" -d -e -f

My preferred way is just adding shellcheck override for them, or switching to helper function like this:

run_command () {
   command -a -b -c $*
}
run_command -d -e -f

Whichever makes more sense for given code.

DKMS issue in GAUDI 1

Hi ALL

I currently using Gaudi 1 with below information:
kernel version: 5.15.0-73-generic.
Currently driver version is 1.17.0-495.
Firmware version is 1.10.0-494.
OS : Distributor ID: Ubuntu
Description: Ubuntu 22.04.4 LTS
Release: 22.04
Codename: jammy

Now I faced the dkms package cannot installed and habanalab driver is not loaded or AIP aborting issue.
Hope can hear back for this issue to make the server run.

measure/perf does not support streams w/ floating point framerate

measure-perf does not correctly handle streams w/ floating point framerates. For example, consider stream w/ framerate=29.97:

#####################################################################
PNP MEDIA SMT AVC-AVC: MULTISTREAM: 1 & ITERATION: 0
#####################################################################
 CONCURRENT: h264_HP@L4_0 123.58 fps/stream , Meets ContentFPS 28500.0 : False , Within margin 2%: 0 True

measure-perf won't go above 1st iteration and thinks that stream is of crazy framerate=28500.

Compare w/ stream of framerate=25:

#####################################################################
PNP MEDIA SMT AVC-AVC: MULTISTREAM: 1 & ITERATION: 0
#####################################################################
 CONCURRENT: 1920x1088_fld_0 25.02 fps/stream , Meets ContentFPS 23.75 : True , Within margin 2%: 0 True

measure-quality: better handling bd-rate outliers

Tests revealed that one of the test sequences (Netflix's DinnerScene) causes perceptual objective metrics (VMAF/SSIM/MS-SSIM) based BD-rates to max out for HEVC on Gen 9, as x265-veryslow reference (tuned for PSNR) has a significant negative shift for this outlier sequence with film-grain noise. The VMAF tool based BD-rate calculator is maxing out the BD-rate at +-1M% which causes the BD-rate test set average to be significantly skewed. This occurrence needs to be handled better. A solution could be to assign maxed out BD-rate values in the results an "N/A" label and skip it in calculating BD-rate average.

dkms: cse module can't be built due to missing commit

DECLARE(`CSE_BACKPORTS_VER',c334b88)

[dvrogozh@dvrscl intel-gpu-cse-backports]$ git show c334b88
fatal: ambiguous argument 'c334b88': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

CSE sources were forced pushed to fix some issue. I think that with the updated checksums this was the commit we've integrated into media-delivery: intel-gpu/intel-gpu-cse-backports@56c6bad. I will check this out on Monday and provide a fix.

Docker CE: No CAP_SYS_ADMIN capability reported while it was set

Specific for Docker CE, works under Docker IO:

$ docker --version
Docker version 20.10.17, build 100c701
$ sudo docker run -it --rm --device=/dev/dri/renderD128 --group-add=109 --cap-add SYS_ADMIN intel-media-delivery:latest capsh --print
error: no CAP_SYS_ADMIN capability (required to get GPU% metrics)
error:   if you run under docker, rerun with:
error:     --cap-add SYS_ADMIN
error: failed to setup demo

measure-perf/smt: segfault on perf. measurement via mediasdk samples on HEVC encoding

$ docker build \
  $(env | grep -E '(_proxy=|_PROXY)' | sed 's/^/--build-arg /') \
  --file Dockerfile.ubuntu \
  --tag intel-media-delivery \
  .
$ docker run  -it --rm --device=/dev/dri/renderD128 --group-add=39 --cap-add SYS_ADMIN intel-media-delivery .

$ ffmpeg -an -hwaccel qsv -qsv_device /dev/dri/renderD128 \
  -c:v h264_qsv -i /opt/data/embedded/WAR_TRAILER_HiQ_10_withAudio.mp4 \
  -vf scale_qsv=w=-1:h=2160,vpp_qsv=framerate=60 \
  -c:v hevc_qsv -preset medium -profile:v main -b:v 1000000 -vframes 20 \
  -y /tmp/WAR.hevc

$ measure perf --verbose --skip-perf /tmp/WAR.hevc
#####################################################################
MSPERF (MULTI STREAMS PERFORMANCE) v0.20.06.03
#####################################################################

ACCEPTED !!! to continue with [utilization/metric/statistic] profiles


#####################################################################
 Profiling: WAR.hevc
 PASS: via FFMPEG/FFPROBE
 content_fps = 60.0 , content_height = 2160 , content_codec = hevc



#####################################################################
PNP MEDIA SMT HEVC-AVC: MULTISTREAM: 1 & ITERATION: 0 - WAR
#####################################################################
 [VERBOSE][CMD] /usr/share/mfx/samples/sample_multi_transcode -fps 60 -i::h265 /tmp/WAR.hevc -hw -async 1 -u 4 -gop_size 256 -dist 8 -num_ref 5 -vbr -b 9000 -NalHrdConformance:off -VuiNalHrdParameters:off -hrd 5000 -InitialDelayInKB 2500 -extbrc::implicit -ExtBrcAdaptiveLTR:on -o::h264 /opt/data/artifacts/measure/perf/output/WAR_hevc_0.h264  -device /dev/dri/renderD128 -p /tmp/perf/WAR_hevc_0_transcode_log.txt >> /tmp/perf/console_log.txt 2>&1

 [VERBOSE][LINUX_PERF_TOOLS] /opt/intel/samples/bin/performance/MSGo.py

 Exit early, hang/error in submitted commands: 239

NOTE: AVC looks working fine. < this was wrong, I mixed with different input stream, this seems input dependent

ffmpeg-hls-client demo hitting 502 bad gateway on multiple streams

ffmpeg-hls-client hitting bad gateway on >1 stream in demo. This is the to-left client pane - sometimes 2/4 streams will run, sometimes 1/4:

Every 1.0s: bash -c watch_pids 3712d5e110d9: Tue Mar 28 05:32:22 2023

ffmpeg streaming clients monitor

Output and logs path: /opt/data/artifacts/ffmpeg-hls-client
Total clients: 4
Running clients: 2
vod/avc/WAR_TRAILER_HiQ_10_withAudio-1: size=21M, frames=1023, fps=24
vod/avc/WAR_TRAILER_HiQ_10_withAudio-2: size=21M, frames=1023, fps=24
Completed clients: 2
vod/avc/WAR_TRAILER_HiQ_10_withAudio-3: size=, frames=, fps=, status=1
vod/avc/WAR_TRAILER_HiQ_10_withAudio-4: size=, frames=, fps=, status=1

CTRL^C to exit monitor and enter shell

The logs in /opt/data/artifacts/ffmpeg-hls-client shows these for the failed ones:
[http @ 0x5648f6f7e7c0] HTTP error 502 Bad Gateway
http://localhost:8080/vod/avc/WAR_TRAILER_HiQ_10_withAudio-3/index.m3u8: Server returned 5XX Server Error reply

I am running the multistream script via docker as per instructions

W: GPG error: https://repositories.intel.com/graphics/ubuntu focal InRelease

ARG APT_GRAPHICS_REPO="https://repositories.intel.com/graphics/ubuntu focal main"

Step 11/80 : RUN apt-get update && apt-get install --no-install-recommends -y   wget   && rm -rf /var/lib/apt/lists/*
 ---> Running in 77bdf775c000
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [111 kB]
Get:4 https://repositories.intel.com/graphics/ubuntu focal InRelease [3195 B]
Get:5 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [45.4 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-backports InRelease [98.3 kB]
Get:7 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [1078 B]
Ign:4 https://repositories.intel.com/graphics/ubuntu focal InRelease
Get:8 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [231 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:10 https://repositories.intel.com/graphics/ubuntu focal/main amd64 Packages [26.6 kB]
Get:11 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [67.5 kB]
Get:12 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:14 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [45.7 kB]
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [207 kB]
Get:17 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [457 kB]
Get:18 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [17.3 kB]
Get:19 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [3195 B]
Fetched 14.5 MB in 2s (6163 kB/s)
Reading package lists...
W: GPG error: https://repositories.intel.com/graphics/ubuntu focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 9B10C065DBB72B06

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.