Giter Site home page Giter Site logo

radical-cybertools / radical.pilot Goto Github PK

View Code? Open in Web Editor NEW
53.0 18.0 21.0 130.43 MB

RADICAL-Pilot

Home Page: http://radical-cybertools.github.io/radical-pilot/index.html

License: Other

Python 82.74% Shell 5.45% Gnuplot 0.59% Jupyter Notebook 10.82% Dockerfile 0.40%
hacktoberfest

radical.pilot's Introduction

RADICAL-Pilot (RP)

Build Status Documentation Status codecov OpenSSF Best Practices

RADICAL-Pilot (RP) executes heterogeneous tasks with maximum concurrency and at scale. RP can concurrently execute up to $10^5$ heterogeneous tasks, including single/multi core/GPU and MPI/OpenMP. Tasks can be stand-alone executables or Python functions and both types of task can be concurrently executed.

RP is a Pilot system, i.e., it separates resource acquisition from using those resources to execute application tasks. RP acquires resources by submitting a job to an HPC platform, and it can directly schedule and launch computational tasks on those resources. Thus, tasks are directly scheduled on the acquired resources, not via the batch system of the HPC platform. RP supports concurrently using single/multiple pilots on single/multiple high performance computing (HPC) platforms.

RP is written in Python and exposes a simple yet powerful API. In 15 lines of code, you can execute an arbitrary number of executables with maximum concurrency on a Linux container or, by changing resource, on one of the supported HPC platforms.

import radical.pilot as rp

# Create a session
session = rp.Session()

# Create a pilot manager and a pilot
pmgr    = rp.PilotManager(session=session)
pd_init = {'resource': 'local.localhost',
           'runtime' : 30,
           'cores'   : 4}
pdesc   = rp.PilotDescription(pd_init)
pilot   = pmgr.submit_pilots(pdesc)

# Crate a task manager and describe your tasks
tmgr = rp.TaskManager(session=session)
tmgr.add_pilots(pilot)
tds = list()
for i in range(8):
    td = rp.TaskDescription()
    td.executable     = 'sleep'
    td.arguments      = ['10']
    tds.append(td)

# Submit your tasks for execution
tmgr.submit_tasks(tds)
tmgr.wait_tasks()

# Close your session
session.close(cleanup=True)

Quick Start

Run RP's quick start tutorial directly on Binder. No installation needed.

After going through the tutorial, install RP and start to code your application:

python -m venv ~/.ve/radical-pilot
. ~/.ve/radical-pilot/bin/activate
pip install radical.pilot

Note that other than venv, you can also use virtualenv, conda or spack.

For some inspiration, see our RP application examples, starting from 00_getting_started.py .

Documentation

RP user documentation uses Sphinx, and it is published on Read the Docs.

RP tutorials can be run via Binder.

Developers

RP development uses Git and GitHub. RP requires Python3, a virtual environment and a GNU/Linux OS. Clone, install and test RP:

python -m venv ~/.ve/rp-docs
. ~/.ve/rp-docs/bin/activate
git clone [email protected]:radical-cybertools/radical.pilot.git
cd radical.pilot
pip install -r requirements-docs.txt
sphinx-build -M html docs/source/ docs/build/

RP documentation uses tutorials coded as Jupyter notebooks. Sphinx and nbsphinx run RP locally to execute those tutorials. Successful compilation of the documentation also serves as a validation of your local development environment.

Provide Feedback

Have a question, feature request or you found a bug? Feel free to open a support ticket. For vulnerabilities, please draft a private security advisory.

Contributing

We welcome everyone that wants to contribute to RP development. We are an open and welcoming community, committed to making participation a harassment-free experience for everyone. See our Code of Conduct, relevant technical documentation and feel free to get in touch.

radical.pilot's People

Contributors

0 avatar andre-merzky avatar aninditachavan avatar aymenfja avatar chengwill97 avatar dyokelson avatar eirrgang avatar ejjordan avatar georgeha avatar ibethune avatar iparask avatar itomaldonado avatar jdakka avatar jhprinz avatar karahbit avatar kartikmodi avatar lee212 avatar marksantcroos avatar mingtaiha avatar mtitov avatar mturilli avatar oleweidner avatar shantenujha avatar vivek-bala avatar vrpascuzzi avatar weiming-hu avatar yhren 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

Watchers

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

radical.pilot's Issues

units fail on india, state remains PENDING

the pilot comes up ok, but in stderr I see:

[merzky@i136 pilot-52d72db1f2291a53ec33a824]$ l
total 48
-rwxr-xr-x 1 merzky users  6047 Jan 15 19:54 bootstrap-and-run-agent
-rwxr-xr-x 1 merzky users 31910 Jan 15 19:54 sinon-pilot-agent.py
-rw------- 1 merzky users   302 Jan 15 19:54 STDERR
-rw------- 1 merzky users   116 Jan 15 19:54 STDOUT

[merzky@i136 pilot-52d72db1f2291a53ec33a824]$ cat STDERR 
git version 1.7.8.3 loaded
Python version 2.7 loaded
/var/spool/torque/mom_priv/jobs/1248011.i136.SC: line 9: cd: //tmp/sinon-merzky/pilot-52d72db1f2291a53ec33a824: No such file or directory
/var/spool/torque/mom_priv/jobs/1248011.i136.SC: line 10: ./bootstrap-and-run-agent: No such file or directory

[merzky@i136 pilot-52d72db1f2291a53ec33a824]$ l -d //tmp/sinon-merzky/pilot-52d72db1f2291a53ec33a824
drwxr-xr-x 2 merzky users 4096 Jan 15 19:54 //tmp/sinon-merzky/pilot-52d72db1f2291a53ec33a824

[merzky@i136 pilot-52d72db1f2291a53ec33a824]$ pwd
/tmp/sinon-merzky/pilot-52d72db1f2291a53ec33a824

No idea what is going on - maybe the leading double slash is causing trouble?

Note that the unit remains in PENDING state forever, which needs fixing.

mongodb URL scheme invalid?

I am not sure what happens here, as the same code worked before. I am using:

        print self._coord
        self._sinon  = sinon.Session (database_url = self._coord)

which shows self._coord as

   'mongodb://ec2-184-72-89-141.compute-1.amazonaws.com:27017/'

which looks just fine -- but I am getting this exception:

Traceback (most recent call last):
  File "examples/phase1_demo_3.py", line 80, in <module>
    troy.execute_workload (workload_id, planner, overlay_mgr, workload_mgr, strategy='basic')
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/troy-0.0.1-py2.7.egg/troy/strategy.py", line 34, in execute_workload
    strategy.execute (workload_id, planner, overlay_mgr, workload_mgr)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/troy-0.0.1-py2.7.egg/troy/plugins/strategy/plugin_strategy_basic.py", line 57, in execute
    overlay_id = overlay_mgr.create_overlay (overlay_descr)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/troy-0.0.1-py2.7.egg/troy/overlay/overlay_manager.py", line 227, in create_overlay
    self._init_plugins  (workload_mgr=workload_mgr)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/troy-0.0.1-py2.7.egg/troy/overlay/overlay_manager.py", line 132, in _init_plugins
    self._provisioner.init_plugin (self._session)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/troy-0.0.1-py2.7.egg/troy/plugin_base.py", line 34, in init_plugin
    self.init ()
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/troy-0.0.1-py2.7.egg/troy/plugins/overlay_provisioner/plugin_overlay_provisioner_sinon.py", line 67, in init
    self._sinon  = sinon.Session (database_url = self._coord)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/sinon-0.1.3-py2.7.egg/sinon/api/session.py", line 81, in __init__
    db_name=database_name)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/sinon-0.1.3-py2.7.egg/sinon/db/database.py", line 82, in new
    s = Session(db_url, db_name)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/sinon-0.1.3-py2.7.egg/sinon/db/database.py", line 63, in __init__
    self._client = MongoClient(db_url)
  File "/home/merzky/saga/troy/ve/local/lib/python2.7/site-packages/pymongo-2.5-py2.7-linux-x86_64.egg/pymongo/mongo_client.py", line 240, in __init__
    "%s" % (entity[:idx],))
pymongo.errors.InvalidURI: Invalid URI scheme: 'mongodb

task execution fails if virtualenv/bin/activate in .bashrc

I see this on India, after the agent finally starts up ok:

(ve)[merzky@i136 task-5294eaa6f2291a60da2b2c83]$ pwd
/N/u/merzky/sinon/pilot-5294ea94f2291a60da2b2c47/task-5294eaa6f2291a60da2b2c83

(ve)[merzky@i136 task-5294eaa6f2291a60da2b2c83]$ l
total 4
-rw-r--r-- 1 merzky users 31 Nov 26 13:39 STDERR
-rw-r--r-- 1 merzky users  0 Nov 26 13:39 STDOUT

(ve)[merzky@i136 task-5294eaa6f2291a60da2b2c83]$ cat *
Host key verification failed.

(ve)[merzky@i136 task-5294eaa6f2291a60da2b2c83]$ ssh localhost hostname
git version 1.7.8.3 loaded
Python version 2.7 loaded
i136

the demo2 script though seems to indicate success:

* Waiting for all compute units to finish...
  FINISHED

agent failing to start on india

$ python demo_milestone_02.py
2014:01:21 10:06:58 MainThread sinon.logger : [INFO ] loading sinon version: 0.1.3-20-gbfc3e3e
2014:01:21 10:06:59 MainThread sinon.logger : [INFO ] Created new Session {'session_uid': '52de8d12a85378cead404187', 'database_url': 'mongodb://ec2-184-72-89-141.compute-1.amazonaws.com:27017/'}.
2014:01:21 10:06:59 MainThread sinon.logger : [INFO ] Added credential {'UserID': 'marksant', 'UserPass': None, 'Type': 'SSH', 'UserKey': None} to session 52de8d12a85378cead404187.
2014:01:21 10:06:59 MainThread sinon.logger : [INFO ] Created new PilotManager {'type': 'PilotManager', 'uid': '52de8d13a85378cead404189'}.

  • Submitting pilot to 'futuregrid.INDIA'...
    2014:01:21 10:07:00 MainThread sinon.logger : [INFO ] Added credential {'UserID': 'marksant', 'UserPass': None, 'Type': 'SSH', 'UserKey': None} to SAGA job service.
    2014:01:21 10:07:01 MainThread sinon.logger : [DEBUG ] Created agent directory 'sftp://india.futuregrid.org//tmp/sinon/pilot-52de8d13a85378cead40418a/'
    2014:01:21 10:07:02 MainThread sinon.logger : [DEBUG ] Copied 'file://localhost//Users/mark/.virtualenv/saga-pilot/bin/bootstrap-and-run-agent' script to agent directory
    2014:01:21 10:07:03 MainThread sinon.logger : [DEBUG ] Copied 'file://localhost//Users/mark/.virtualenv/saga-pilot/lib/python2.7/site-packages/sinon/agent/sinon-pilot-agent.py' script to agent directory 'sftp://india.futuregrid.org//tmp/sinon/pilot-52de8d13a85378cead40418a/'
    2014:01:21 10:07:06 MainThread sinon.logger : [INFO ] Created new ComputePilot {'type': 'ComputePilot', 'id': '52de8d13a85378cead40418a'}

And then it stops.

I see on india that the job has completed already:
$ qstat -f 1326243
Job Id: 1326243.i136
Job_Name = SAGA-Python-PBSJobScript.f25824
Job_Owner = marksant@i136
resources_used.cput = 00:00:00
resources_used.mem = 0kb
resources_used.vmem = 0kb
resources_used.walltime = 00:00:00
job_state = C
queue = batch
server = i136
Checkpoint = u
ctime = Tue Jan 21 10:07:04 2014
Error_Path = i136://tmp/sinon/pilot-52de8d13a85378cead40418a/STDERR
exec_host = i82/7+i82/6+i82/5+i82/4+i82/3+i82/2+i82/1+i82/0
Hold_Types = n
Join_Path = n
Keep_Files = n
Mail_Points = a
mtime = Tue Jan 21 10:07:13 2014
Output_Path = i136://tmp/sinon/pilot-52de8d13a85378cead40418a/STDOUT
Priority = 0
qtime = Tue Jan 21 10:07:04 2014
Rerunable = True
Resource_List.ncpus = 1
Resource_List.nodect = 1
Resource_List.nodes = 1:ppn=8
Resource_List.walltime = 00:10:00
session_id = 14392
Variable_List = PBS_O_QUEUE=batch,PBS_O_HOME=/N/u/marksant,
PBS_O_LANG=en_US.UTF-8,PBS_O_LOGNAME=marksant,
PBS_O_PATH=/opt/xcat/bin:/opt/xcat/sbin:/N/soft/moab/5.4.0/sbin:/N/so
ft/moab/5.4.0/bin:/opt/torque/sbin:/opt/torque/bin:/usr/kerberos/bin:/
usr/bin:/bin:/usr/sbin:/sbin:/opt/openssh-4.6p1/bin:/N/u/marksant/bin:
/N/u/marksant/bin,PBS_O_MAIL=/var/spool/mail/marksant,
PBS_O_SHELL=/bin/bash,PBS_O_HOST=i136,PBS_SERVER=i136,
PBS_O_WORKDIR=/N/u/marksant,MODULE_VERSION_STACK=3.2.8,
MANPATH=/opt/xcat/share/man:/N/soft/moab/5.4.0/man:/opt/torque/man:/u
sr/share/man,HOSTNAME=i136,SHELL=/bin/bash,TERM=vt100,HISTSIZE=1000,
SSH_CLIENT=69.125.59.160 64256 22,SSH_TTY=/dev/pts/15,PERL_BADLANG=0,
USER=marksant,
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01
:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=
01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar
=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.zip=01;31:.z
=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01
;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;35:.xbm=01;35:.xpm
=01;35:.png=01;35:.tif=01;35:,
LD_LIBRARY_PATH=/N/soft/moab/5.4.0/lib:/opt/torque/lib,
XCATROOT=/opt/xcat,
PATH=/opt/xcat/bin:/opt/xcat/sbin:/N/soft/moab/5.4.0/sbin:/N/soft/moa
b/5.4.0/bin:/opt/torque/sbin:/opt/torque/bin:/usr/kerberos/bin:/usr/bi
n:/bin:/usr/sbin:/sbin:/opt/openssh-4.6p1/bin:/N/u/marksant/bin:/N/u/m
arksant/bin,MAIL=/var/spool/mail/marksant,MODULE_VERSION=3.2.8,
PWD=/N/u/marksant,INPUTRC=/etc/inputrc,
LMFILES=/opt/Modules/3.2.8/modulefiles/tools/torque/2.5.5:/opt/Modu
les/3.2.8/modulefiles/tools/moab/5.4.0,LANG=en_US.UTF-8,
MODULEPATH=/opt/Modules/3.2.8/modulefiles/applications:/opt/Modules/3
.2.8/modulefiles/compilers:/opt/Modules/3.2.8/modulefiles/debuggers:/o
pt/Modules/3.2.8/modulefiles/libraries:/opt/Modules/3.2.8/modulefiles/
tools,LOADEDMODULES=torque/2.5.5:moab/5.4.0,PS1=PROMPT-$?->,
XCATHOST=im1:3001,PS2=,
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass,
HOME=/N/u/marksant,SHLVL=1,LOGNAME=marksant,CVS_RSH=ssh,
SSH_CONNECTION=69.125.59.160 64256 149.165.146.136 22,
MODULESHOME=/opt/Modules/3.2.8,LESSOPEN=|/usr/bin/lesspipe.sh %s,
INCLUDE=/N/soft/moab/5.4.0/include:/opt/torque/include,
G_BROKEN_FILENAMES=1,
module=() { eval /opt/Modules/$MODULE_VERSION/bin/modulecmd bash $*
},_=/opt/torque/bin/qsub
etime = Tue Jan 21 10:07:04 2014
exit_status = 127
submit_args = /tmp/SAGA-Python-PBSJobScript.f25824
start_time = Tue Jan 21 10:07:11 2014
Walltime.Remaining = 559
start_count = 1
fault_tolerant = False
comp_time = Tue Jan 21 10:07:13 2014
submit_host = i136
init_work_dir = /N/u/marksant

In /tmp/sinon/pilot-52de8d13a85378cead40418a/STDERR i see:
/var/spool/torque/mom_priv/jobs/1326243.i136.SC: line 11: ./bootstrap-and-run-agent: No such file or directory

This is all on the devel branch.

reconnect to Unit?

Assume I have a pilot, and can list its unit IDs -- which is what I want to do in a scheduler in Troy for example. No I have a unit ID, but that does not seem to suffice to reconnect to the unit -- I would also need a unit manager ID. How can I obtain that? I guess I should cycle through the list of UMs the pilot is registered with?

Bulk submission failures / possible output verbosity bug

The documentation says I should get output like this:

    The results should look something like this::

        * [ERROR] Pilot {'type': 'pilot', 'id': '528d13296bf88b12e91e19e0'} failed: No entry found for resource 
key 'futuregrid.DOES_NOT_EXIST' in resource configuration..
        * [OK]    Pilot {'type': 'pilot', 'id': '528d13296bf88b12e91e19df'} submitted successfully: Pilot Job su
ccessfully submitted with JobID '[pbs+ssh://sierra.futuregrid.org/.]-[705456]'
        * [ERROR] Pilot {'type': 'pilot', 'id': '528d13296bf88b12e91e19de'} failed: Pilot Job submission failed:
 'invalid dir '/N/u/merzky/sinon/pilot-528d13296bf88b12e91e19de': mkdir: cannot create directory `/N/u/merzky/si
non/pilot-528d13296bf88b12e91e19de': Permission denied

However I get just one line of output before the script returns, which oddly is different depending on verbosity options:

(saga-pilot-env)ashley@lapcat:~/saga-pilot$ python examples/bulk_pilot_submission.py 
2014:01:14 13:39:32 MainThread   saga.logger           : [INFO    ] saga-python     version: 0.9.16
Error: ComputePilotDescription.resource key 'futuregrid.DOES_NOT_EXIST' is not known by this PilotManager.

With additional verbosity, a different error is returned:

(saga-pilot-env)ashley@lapcat:~/saga-pilot$ SAGA_VERBOSE=9 BIGJOB_VERBOSE=9 python examples/bulk_pilot_submission.py 
2014:01:14 13:39:42 MainThread   saga.logger           : [INFO    ] saga-python     version: 0.9.16
Error: ComputePilotDescription does not define mandatory attribute 'run_time'.

STDERR: sinon-agent: command not found

For both demo 1 & 2, on india in the pilot directory:

$ cat STDERR
torque/2.5.5 version 2.5.5 loaded
torque/2.5.5 version 2.5.5 loaded
Python version 2.7 loaded
Intel compiler suite version 11.1/072 loaded
OpenMPI version 1.4.2 loaded
./bootstrap-and-run-agent: line 90: sinon-agent: command not found

Agent fails with a .bashrc loading a specific version of python

I am running my tests on india.uturegrid.org

With the following line in my .bashrc:

module load python/2.7.2

The agent fails with the following in STDERR:

Python version 2.7.2 loaded
git version 1.7.8.3 loaded
Python version 2.7.2 loaded
git version 1.7.8.3 loaded
python/2.7(21):ERROR:150: Module 'python/2.7' conflicts with the currently loaded module(s) 'python/2.7.2'
python/2.7(21):ERROR:102: Tcl command execution failed: conflict python

Intel compiler suite version 11.1/072 loaded
OpenMPI version 1.4.2 loaded
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 1957k 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100 1957k 100 1957k 0 0 10.3M 0 --:--:-- --:--:-- --:--:-- 14.0M
Traceback (most recent call last):
File "/N/soft/python/2.7.2/lib/python2.7/site.py", line 62, in
import os
File "/N/soft/python/2.7.2/lib/python2.7/os.py", line 398, in
import UserDict
File "/N/soft/python/2.7.2/lib/python2.7/UserDict.py", line 83, in
import _abcoll
File "/N/soft/python/2.7.2/lib/python2.7/_abcoll.py", line 11, in
from abc import ABCMeta, abstractmethod
File "/N/soft/python/2.7.2/lib/python2.7/abc.py", line 8, in
from _weakrefset import WeakSet
File "/N/soft/python/2.7.2/lib/python2.7/_weakrefset.py", line 5, in
from _weakref import ref
ImportError: No module named _weakref

Commenting out the aforementioned line in .bashrc addresses the issue.

run_time mandatory

The run_time attribute seems mandatory on a pilot description -- that does not make sense from a Troy perspective, as this would make it impossible (or at least very difficult) to re-use an overlay -- we do not know the requirements of future when provisioning the overlay...

Reconnectability

Pilots must be able to run fully disconnected from an application, but it must also be easy, fast and reliable to reconnect to them, for inspection and management of the pilot itself, and for CU submission, inspection and management.

um.wait_units() hangs on India

Hi,

I am not 100% sure if this is a bug or an error in my script, but at least the same script worked fine yesterday on Sierra (same setup same test). For first few pilots everything is OK, but for some I get in AGENT.LOG:

2014-01-21 13:42:59,420 - sinon.agent - INFO - Found PBS_NODEFILE /var/spool/torque/aux//1326319.i136: ['i82', 'i82', 'i82', 'i82', 'i82', 'i82', 'i82', 'i82']
2014-01-21 13:42:59,426 - sinon.agent - INFO - Discovered execution environment: {'i82': {'cores': 8, 'memory': 0}}
2014-01-21 13:42:59,426 - sinon.agent - INFO - Dicsovered launch method: MPIRUN (/N/soft/openmpi/1.4.2/bin/mpirun)
2014-01-21 13:42:59,554 - sinon.agent - INFO - Started up <ExecWorker(ExecWorker-1, started daemon)> serving hosts ['i82']
2014-01-21 13:42:59,554 - sinon.agent - INFO - Agent started. Database updated.
2014-01-21 13:42:59,609 - sinon.agent - ERROR - MongoDB error while checking for new work units: no such item for Cursor instance
2014-01-21 13:42:59,636 - sinon.agent - INFO - Agent stopped. Database updated.

Cheers,
Antons

Support $HOME, etc as working_directory

From Matteo's email:

From the AIMES and TROY point of views this is quite a sensitive decision. I agree users should be allow for explicitly specifying a working directory for the agent, but for an overlay and workload manager that have to work across multiple DCIs, it would be very useful - if not fundamental - to be able to use $HOME instead of the actual path to $HOME and, in case, having a default behavior based, that too, on $HOME.

Apparently, cancel does not cancel the pilot

It might be a problem with TROY but, at the moment, the following code calling cancel on a pilot does not cancel it:

    def pilot_cancel (self, pilot) :
        [sinon_um, sinon_pm, sinon_pilot] = pilot._get_instance ('sinon')
        sinon_pilot.cancel ()

Pilot API: Pilot Description

Agree upon a pragmatic, usable and intuitive 'pilot description'.

As part of the design of SAGA-Pilot, I would like to discuss how we are going to handle pilot descriptions. As you know, current BigJob / Pilot-API uses the saga 'job description', a somewhat sub-optimal way of doing things which has lead to some confusion and frustration in the past:

saga-project/BigJob#107

I have noticed that the latest rendering of Pilot-API is doing things differently: https://github.com/saga-project/saga-pilot/blob/master/doc/api.py.

I would like to make sure that pilot description is not just a "by-product" of Pilot-AP, but a first-order design consideration. I am sure especially Melissa can give us some valuable input and feedback as she's currently battling with documenting this very feature in BigJob.

openmpi on india

The pilot used to fail with missing mpirun -- now I have 'module load openmpi' in my bashrc, and I now see:

(ve)[merzky@i136 pilot-52e70834f2291a1cc4924ed9]$ cat STDERR 
git version 1.7.8.3 loaded
openmpi/1.4.2(21):ERROR:150: Module 'openmpi/1.4.2' conflicts with the currently loaded module(s) 'openmpi/1.4.3-gnu'
openmpi/1.4.2(21):ERROR:102: Tcl command execution failed: conflict openmpi

Python version 2.7 loaded
git version 1.7.8.3 loaded
openmpi/1.4.2(21):ERROR:150: Module 'openmpi/1.4.2' conflicts with the currently loaded module(s) 'openmpi/1.4.3-gnu'
openmpi/1.4.2(21):ERROR:102: Tcl command execution failed: conflict openmpi

What should I set up?

working directory not supported for compute unit?

I don't seem to be able to specify a working dir for a compute unit, nor do I see support in the code. But maybe I am just missing it? Is a WD supported?

If not, then we need it -- se the data staging ticket #32: without an explicit working directory (which is difficult enough to specify), I cannot even do manual data staging...

saga-pilot installation

Hi,

This is what I have experienced while installing saga-pilot:

(myenv)antons@ubuntu:/sinon/saga-pilot$ pip install --upgrade -e git://github.com/saga-project/saga-pilot.git@master#egg=saga-pilot
. . .
Successfully installed saga-pilot setuptools saga-python radical.utils psutil motor python-hostlist colorama apache-libcloud pymongo tornado greenlet
Cleaning up...
(myenv)antons@ubuntu:
/sinon/saga-pilot$ sinon-version
Traceback (most recent call last):
File "", line 1, in
File "/home/antons/myenv/src/saga-pilot/src/sinon/init.py", line 20, in
from sinon.api.session import Session
File "/home/antons/myenv/src/saga-pilot/src/sinon/api/session.py", line 17, in
from sinon.db import Session as dbSession
File "/home/antons/myenv/src/saga-pilot/src/sinon/db/init.py", line 4, in
from database import *
File "/home/antons/myenv/src/saga-pilot/src/sinon/db/database.py", line 395
{"info.state"}
^
SyntaxError: invalid syntax
(myenv)antons@ubuntu:~/sinon/saga-pilot$ python
Python 2.6.5 (r265:79063, Sep 26 2013, 18:51:09)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

import sinon
Traceback (most recent call last):
File "", line 1, in
File "/home/antons/myenv/src/saga-pilot/src/sinon/init.py", line 20, in
from sinon.api.session import Session
File "/home/antons/myenv/src/saga-pilot/src/sinon/api/session.py", line 17, in
from sinon.db import Session as dbSession
File "/home/antons/myenv/src/saga-pilot/src/sinon/db/init.py", line 4, in
from database import *
File "/home/antons/myenv/src/saga-pilot/src/sinon/db/database.py", line 395
{"info.state"}
^
SyntaxError: invalid syntax

Cheers,
Anton

bootstrap on india fails

I am using sinon version: 0.1.3-4-g7bead03, and agent staging seems to work ok. However, the STDOUT contains only the usage message for the agent, so I assume it is called with incorrect parameters or something...

setup.py test fails

On a fresh checkout and install I get:

$ python setup.py test
Traceback (most recent call last):
File "setup.py", line 155, in
setup(**setup_args)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py", line 138, in setup
ok = dist.parse_command_line()
File "/Users/mark/.virtualenv/sinon/lib/python2.7/site-packages/setuptools/dist.py", line 276, in parse_command_line
result = _Distribution.parse_command_line(self)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 467, in parse_command_line
args = self._parse_command_opts(parser, args)
File "/Users/mark/.virtualenv/sinon/lib/python2.7/site-packages/setuptools/dist.py", line 602, in _parse_command_opts
nargs = _Distribution._parse_command_opts(self, parser, args)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 540, in _parse_command_opts
cmd_class
distutils.errors.DistutilsClassError: command class main.our_test must provide 'user_options' attribute (a list of tuples)

agent startup fails

I see in STDOUT:

################################################################################
## Installing python-hostlist
## CMDLINE: pip install python-hostlist
Wheel installs require setuptools >= 0.8 for dist-info support.
pip's wheel support requires setuptools >= 0.8 for dist-info support.
Storing debug log for failure in /home/merzky/.pip/pip.log
Couldn't install python-hostlist! ABORTING

no idea what this means.

user specific paths in demo scripts

This goes back to home dir support I guess -- but right now a user has to edit the demo scripts before running them, to set a valid agent path. It would be helpful to support relative paths, relative to the home dir, or /tmp/, or /tmp/sinon-$(id -un), or whatever Sinon defines as root for relative paths...

Resource string specification

Use a standard URI to specify a resource instead of _name_resource.NAME-HEAD-NODE.

Rationale: The amount of knowledge asked to the user is comparable - she has to know about the resource name and the head node name - but the amount of semantics that can be packed within a URI is larger. Such semantics - e.g. what is the real DNS name of the head node, not just the host name - is useful and sometimes fundamental when writing applications that use saga-pilot. Typical scenarios include data (pre/post) staging, (dynamic) introspection, resource information. TROY is a use case for such scenarios.

Milestone 1&2 error messages

With latest devel:

(saga-pilot-env)ashley@lapcat:~/saga-pilot$ SAGA_VERBOSE=9 BIGJOB_VERBOSE=9 python examples/milestones/demo_milestone_01.py 
2013:12:17 15:10:19 MainThread   saga.logger           : [INFO    ] saga-python     version: 0.9.14-5-g95d638b

Demo part 01: Create a new Session with a PilotManager and UnitManager.
Traceback (most recent call last):
  File "examples/milestones/demo_milestone_01.py", line 93, in <module>
    session_uid = demo_milestone_01_1()
  File "examples/milestones/demo_milestone_01.py", line 34, in demo_milestone_01_1
    cu = sinon.ComputeUnitDescription()
  File "/home/ashley/saga-pilot-env/local/lib/python2.7/site-packages/sinon/compute_unit_description.py", line 36, in __init__
    descr.Description.__init__ (self, vals)
NameError: global name 'descr' is not defined
(saga-pilot-env)ashley@lapcat:~/saga-pilot$ SAGA_VERBOSE=9 BIGJOB_VERBOSE=9 python examples/milestones/demo_milestone_02.py 
2013:12:17 15:11:34 MainThread   saga.logger           : [INFO    ] saga-python     version: 0.9.14-5-g95d638b
Traceback (most recent call last):
  File "examples/milestones/demo_milestone_02.py", line 56, in <module>
    sys.exit(demo_milestone_02())
  File "examples/milestones/demo_milestone_02.py", line 27, in demo_milestone_02
    pd.slots = 16
  File "/home/ashley/saga-pilot-env/local/lib/python2.7/site-packages/radical/utils/signatures.py", line 446, in takes_invocation_proxy
    return method(*pargs, **pkwargs)
  File "/home/ashley/saga-pilot-env/local/lib/python2.7/site-packages/radical/utils/signatures.py", line 477, in returns_invocation_proxy
    result = method (*args, **kwargs)
  File "/home/ashley/saga-pilot-env/local/lib/python2.7/site-packages/saga/attributes.py", line 2641, in __setattr__
    return self._attributes_i_set      (key, val, flow=self._DOWN)
  File "/home/ashley/saga-pilot-env/local/lib/python2.7/site-packages/saga/attributes.py", line 1064, in _attributes_i_set
    raise se.IncorrectState ("attribute set is not extensible/private (key %s)" %  key)
saga.exceptions.IncorrectState: attribute set is not extensible/private (key slots) (/home/ashley/saga-pilot-env/local/lib/python2.7/site-packages/saga/attributes.py +1064 (_attributes_i_set)  :  raise se.IncorrectState ("attribute set is not extensible/private (key %s)" %  key))

FWIW setup.py test works:

(saga-pilot-env)ashley@lapcat:~/saga-pilot$ python setup.py test
running test
running egg_info
writing requirements to src/sinon.egg-info/requires.txt
writing src/sinon.egg-info/PKG-INFO
writing top-level names to src/sinon.egg-info/top_level.txt
writing dependency_links to src/sinon.egg-info/dependency_links.txt
reading manifest file 'src/sinon.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'src/sinon/VERSION'
writing manifest file 'src/sinon.egg-info/SOURCES.txt'
running build_ext
2013:12:17 15:12:25 MainThread   saga.logger           : [INFO    ] saga-python     version: 0.9.14-5-g95d638b
test__unitmanager_create (sinon.tests.api.test_unit_manager.TestUnitManager)
Test if unit manager creation works as expected. ... ok
test__unitmanager_pilot_assoc (sinon.tests.api.test_unit_manager.TestUnitManager)
Test if unit manager <-> pilot association works as expected. ... ok
test__unitmanager_reconnect (sinon.tests.api.test_unit_manager.TestUnitManager)
Test if unit manager reconnection works as expected. ... ok
test__pilotmanager_create (sinon.tests.api.test_pilot_manager.Test_PilotManager)
Test if pilot manager creation works as expected. ... ok
test__pilotmanager_get_pilots (sinon.tests.api.test_pilot_manager.Test_PilotManager) ... ok
test__pilotmanager_list_pilots (sinon.tests.api.test_pilot_manager.Test_PilotManager)
Test if listing pilots works as expected. ... ok
test__pilotmanager_list_pilots_after_reconnect (sinon.tests.api.test_pilot_manager.Test_PilotManager)
Test if listing pilots after a reconnect works as expected. ... ok
test__pilotmanager_reconnect (sinon.tests.api.test_pilot_manager.Test_PilotManager)
Test if pilot manager re-connect works as expected. ... ok
test__session_create (sinon.tests.api.test_session.Test_Session)
Tests if creating a new session works as epxected. ... ok
test__session_reconnect (sinon.tests.api.test_session.Test_Session)
Tests if reconnecting to an existing session works as epxected. ... ok

----------------------------------------------------------------------
Ran 10 tests in 17.343s

OK

Data Staging *required* to function, $HOME needs to be supported.

Sinon accepts a resource string which is not the URL, and at the same time expects a working directory being specified. So the user is supposed not to know the resource access mechanism, but is supposed to know the storage layout -- that does not match.

Specifically, in troy I am trying to run create a Sinon pilot on some target resource. The only thing I know about the resource is something like futuregrid.INDIA or xsede.STAMPEDE (very useless casing rule BTW -- please move to all lowercase). In order to do that, I need to specify a working dir -- but have no idea what a shared FS on the target system is, where my home dir is, etc. Using /tmp/ (which is always present) will fail on india (this caused #31 after all). $HOME cannot be used, nor can ~, not any other env variable.

So, Troy now needs to maintain a resource config file, where it keeps resource URLs for BigJob, resource IDs as above for Sinon, and working dir templates for BigJob and Sinon. For that WD template, troy needs to run a SAGA command on the target host to find out the target user name -- which requires us, in the Sinon case, to keep the resource URL which the resource IDs were supposed to hide in the first place.

The same problem hits once we want to stage data to a unit -- Sinon does not support staging, so we need to either specify a unit working dir (with the same problem as above), or need to inspect pilot and unit for the respective working dirs (which is not working). I can't even inspect the actual resource URL, as the pilot resource attribute only contains the resource ID originally specified.

There are reasons why things are this way, I understand that -- but at the moment it is harder for me to solve that in Sinon than in Bigjob. This needs fixing.

(a) Sinon needs to prvide support to define a sensible, target specific agent working directory, or needs a sensible default.

(b) Sinon needs to either allow inspection of target resource and working dirs, or needs to support simple file staging for units itself (the latter being preferred).

I think us 'needing time to understand what file staging means' is the wrong approach -- we should implement a simple file stage now, and then amend once we have other requirements...

task execution fails on alamo, pilot dies, workload state not updated

Running demo2 on alamo gives the following agent log:

[merzky@login1 pilot-52ab6e54f2291a7855b36ee8]$ cat STDERR 
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded
Intel compiler suite version 11.1/072 loaded
OpenMPI version 1.4.5 loaded
Process ExecWorker-1:
Traceback (most recent call last):
  File "/N/soft/python/2.7/lib/python2.7/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "sinon-pilot-agent.py", line 483, in run
    self._update_tasks(update_tasks)
  File "sinon-pilot-agent.py", line 518, in _update_tasks
    "info.exit_code"     : task.exit_code}})
  File "//N/u/merzky/sinon/pilot-52ab6e54f2291a7855b36ee8/virtualenv/lib/python2.7/site-packages/pymongo/collection.py", line 487, in update
    check_keys, self.__uuid_subtype), safe)
  File "//N/u/merzky/sinon/pilot-52ab6e54f2291a7855b36ee8/virtualenv/lib/python2.7/site-packages/pymongo/mongo_client.py", line 969, in _send_message
    rv = self.__check_response_to_last_error(response)
  File "//N/u/merzky/sinon/pilot-52ab6e54f2291a7855b36ee8/virtualenv/lib/python2.7/site-packages/pymongo/mongo_client.py", line 911, in __check_response_to_last_error
    raise OperationFailure(details["err"], details["code"])
OperationFailure: not okForStorage
Warning: Permanently added 'c093.cm.cluster,10.141.0.93' (RSA) to the list of known hosts.
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded
Python version 2.7 loaded

The workload.wait() seems to hang -- I assume that the pilot dies - qstat doesn't show it anymore. As with one of the other tickets, the workload state is not updated, and the demo just hangs.

default_queue vs queue

The config files use "default_queue", but this is not used in the code.
That looks for "queue" in the resource description.

Issues with double naming

'Sinon' and 'saga-pilot' are used to indicate the same code base. This leads to some confusion - for example: pip uninstall sinon, but pip install --upgrade -e git://github.com/saga-project/saga-pilot.git@master#egg=saga-pilot.

Could a single name be chosen? If so, I would vote for saga-pilot.

unit_manager.__init__ args

the UM gets a special value for scheduler on reconnect -- I think this should be a separate parameter, because otherwise it wouldn't know what scheduler to load. But that also means that the scheduler name needs to be part of the state manager between UM uses.

plugin error with demo_milestone_01 (and _02)

$ python demo_milestone_01.py

Demo part 01: Create a new Session with a PilotManager and UnitManager.
Traceback (most recent call last):
File "demo_milestone_01.py", line 103, in
session_uid = demo_milestone_01_1()
File "demo_milestone_01.py", line 38, in demo_milestone_01_1
um = sinon.UnitManager(session=session, scheduler="direct-submission")
File "/Users/mark/.virtualenv/sinon/lib/python2.7/site-packages/sinon-0.1.1-py2.7.egg/sinon/frontend/unit_manager.py", line 121, in init
self._scheduler = pm.load('unit_scheduler', scheduler)
File "/Users/mark/.virtualenv/sinon/lib/python2.7/site-packages/radical.utils-0.4.0-py2.7.egg/radical/utils/plugin_manager.py", line 164, in load
raise LookupError ("No such plugin type %s" % ptype)
LookupError: No such plugin type unit_scheduler

pbs+ssh

Actually, this was a stupid ticket.... ignore!

Pilot bootstrap fails on alamo

[merzky@login1 pilot-52a1bf0df2291a540a47fea8]$ tail STDERR
/N/u/merzky/.bashrc: line 14: /N/u/merzky/ve/bin/activate: No such file or directory
Python version 2.7 loaded
ModuleCmd_Load.c(200):ERROR:105: Unable to locate a modulefile for 'git'
/N/u/merzky/.bashrc: line 14: /N/u/merzky/ve/bin/activate: No such file or directory
Python version 2.7 loaded
ModuleCmd_Load.c(200):ERROR:105: Unable to locate a modulefile for 'git'
/N/u/merzky/.bashrc: line 14: /N/u/merzky/ve/bin/activate: No such file or directory
Python version 2.7 loaded
ModuleCmd_Load.c(200):ERROR:105: Unable to locate a modulefile for 'git'
/N/u/merzky/.bashrc: line 14: /N/u/merzky/ve/bin/activate: No such file or directory


[merzky@login1 pilot-52a1bf0df2291a540a47fea8]$ tail STDOUT
New python executable in //N/u/merzky/sinon/pilot-52a1bf0df2291a540a47fea8/virtualenv/bin/python
Installing setuptools................................done.
Installing pip...................done.

################################################################################
## Installing apache-libcloud
## CMDLINE: pip install -q -e git://github.com/apache/[email protected]#egg=apache-libcloud
Cannot find command 'git'
Storing complete log in /N/u/merzky/.pip/pip.log
Couldn't install apache-libcloud! ABORTING


[merzky@login1 pilot-52a1bf0df2291a540a47fea8]$ tail  /N/u/merzky/.pip/pip.log
    req_to_install.update_editable(not self.is_download)
  File "//N/u/merzky/sinon/pilot-52a1bf0df2291a540a47fea8/virtualenv/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg/pip/req.py", line 418, in update_editable
    vcs_backend.obtain(self.source_dir)
  File "//N/u/merzky/sinon/pilot-52a1bf0df2291a540a47fea8/virtualenv/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg/pip/vcs/git.py", line 111, in obtain
    call_subprocess([self.cmd, 'clone', '-q', url, dest])
  File "//N/u/merzky/sinon/pilot-52a1bf0df2291a540a47fea8/virtualenv/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg/pip/vcs/__init__.py", line 110, in cmd
    command = find_command(self.name)
  File "//N/u/merzky/sinon/pilot-52a1bf0df2291a540a47fea8/virtualenv/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg/pip/util.py", line 108, in find_command
    raise BadCommand('Cannot find command %r' % cmd)
BadCommand: Cannot find command 'git'

[merzky@login1 pilot-52a1bf0df2291a540a47fea8]$ which git
/usr/local/bin/git

agent fails on sierra over ssh

I see:

(ve)[merzky@s1 sinon]$ l
total 1
drwxr-xr-x 2 merzky users 6 Dec 13 12:45 pilot-52ab71c5f2291a17079812ac

(ve)[merzky@s1 sinon]$ cd pilot-52ab71c5f2291a17079812ac/

(ve)[merzky@s1 pilot-52ab71c5f2291a17079812ac]$ l
total 39
-rwxr-xr-x 1 merzky users  5309 Dec 13 12:45 bootstrap-and-run-agent
-rwxr-xr-x 1 merzky users 30136 Dec 13 12:45 sinon-pilot-agent.py
-rw-r--r-- 1 merzky users   116 Dec 13 12:45 STDERR
-rw-r--r-- 1 merzky users     0 Dec 13 12:45 STDOUT

(ve)[merzky@s1 pilot-52ab71c5f2291a17079812ac]$ cat STDERR
Python version 2.7 loaded
git version 1.7.10 loaded
/bin/bash: ./bootstrap-and-run-agent: No such file or directory

bulk example fails

(ve)merzky@thinkie:~/saga/saga-pilot (master %) $ python examples/bulk_pilot_submission.py 
 * [ERROR] Pilot {'resource': u'futuregrid.INDIA', 'state': u'Failed', 'type': 'ComputePilot', 'id': '52a8f4e7f2291a76a962b5dc'} failed: ComputePilotDescription does not define mandatory attribute 'run_time'..
 * [ERROR] Pilot {'resource': u'futuregrid.SIERRA', 'state': u'Failed', 'type': 'ComputePilot', 'id': '52a8f4e7f2291a76a962b5dd'} failed: ComputePilotDescription does not define mandatory attribute 'run_time'..
 * [ERROR] Pilot {'resource': u'futuregrid.DOES_NOT_EXIST', 'state': u'Failed', 'type': 'ComputePilot', 'id': '52a8f4e7f2291a76a962b5de'} failed: No entry found for resource key 'futuregrid.DOES_NOT_EXIST' in resource configuration..

Examples contain hardcoded paths/authentication

There are hardcoded username/directories in the example/other files including:

examples/milestones/demo_milestone_01.py:        cred.user_id = "oweidner"
examples/milestones/demo_milestone_02.py:        cred.user_id = "oweidner"
examples/milestones/demo_milestone_02.py:        pd.working_directory = "/N/u/oweidner/sinon/"

We should probably swap this out for environment / config file variables instead...

Milestone #2 fails/hangs, no jobs in queues on remote machines

With SAGA_VERBOSE=9 and BIGJOB_VERBOSE=9 I get normal-looking output, and then:

f2', '52d583630caaf35127ca18f3', '52d583630caaf35127ca18f4', '52d583630caaf35127ca18f5', '52d583630caaf35127ca18
f6', '52d583630caaf35127ca18f7', '52d583630caaf35127ca18e8', '52d583630caaf35127ca18e9', '52d583630caaf35127ca18
ea', '52d583630caaf35127ca18eb', '52d583630caaf35127ca18ec', '52d583630caaf35127ca18ed', '52d583630caaf35127ca18
ee', '52d583630caaf35127ca18ef', '52d583630caaf35127ca18e0', '52d583630caaf35127ca18e1', '52d583630caaf35127ca18
e2', '52d583630caaf35127ca18e3', '52d583630caaf35127ca18e4', '52d583630caaf35127ca18e5', '52d583630caaf35127ca18
e6', '52d583630caaf35127ca18e7']
* Waiting for all compute units to finish...

It hangs at this point. I checked all machines that the script submits to, and pilots were set up/running -- but eventually there are no pilots on any machine and the script just hangs. I'm not sure if this is FG-level problems -- however, milestone #1 and #3 run fine (after modifications to remove hardcoded username/directory)

pm.cancel_pilots() does not support string and list parameters

Hi,

While calling pm.cancel_pilots() without any parameters, later call to pilot_object._get_stop_time_priv() returns a value, but when I try to provide a string or a list as a parameter to pm.cancel_pilots() function (e.g. pilot id), call to pilot_object._get_stop_time_priv() returns None. I have verified that inside cancel_pilots() just before the call to db pilot id is correct. Any ideas?

Cheers,
Antons

pilot state incorrect on failing pilot

Run demo2, add after unit submission:

print p1.state
time.sleep (10)
print p1.state

During sleep, qdel the pilot -- on Sinon level, the pilot state will remain 'pending' forever. I guess the state check is looking at the database entry only, and the agent did not call home, so is considered Pending? I think the state getter should also check the agent's job state via saga -- this should resolve this issue (I hope)

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.