{"id":458,"date":"2020-05-11T14:14:00","date_gmt":"2020-05-11T13:14:00","guid":{"rendered":"http:\/\/elcep.legtux.org\/?p=458"},"modified":"2020-05-04T09:56:08","modified_gmt":"2020-05-04T08:56:08","slug":"cormas-dans-container-openmole","status":"publish","type":"post","link":"https:\/\/elcep.legtux.org\/?p=458","title":{"rendered":"Cormas dans container OpenMole"},"content":{"rendered":"<p>Je parlais l&rsquo;autre jour de l&rsquo;utilisation de Cormas dans Docker et j&rsquo;avais \u00e9voqu\u00e9 la possibilit\u00e9 d&rsquo;utiliser cette plateforme multi-agent \u00e0 l&rsquo;int\u00e9rieur d&rsquo;openMole pour pouvoir b\u00e9n\u00e9ficier des possibilit\u00e9s de la taupe pour parall\u00e9liser le calcul et explorer des mod\u00e8les.<\/p>\n<p>J&rsquo;avais profit\u00e9 de Romain pendant le <a href=\"https:\/\/blog.openmole.org\/codingcamp2018\/\">coding-camp 2018<\/a> pour qu&rsquo;on propose une premi\u00e8re version de plug-in cormas pour openMole. En plus d&rsquo;ouvrir des portent au calcul pour Cormas, l&rsquo;id\u00e9e \u00e9tait de permettre \u00e0 l&rsquo;\u00e9quipe de d\u00e9velopper de se concentrer sur le d\u00e9veloppement de la plateforme plut\u00f4t que sur le red\u00e9veloppement des m\u00e9thodes de calcules.<\/p>\n<h2>Etape 1 : un container OpenMole<\/h2>\n<p>Pour tester Cormas dans openMole le plus simple est d&rsquo;utiliser docker. En effet l&rsquo;\u00e9quipe openMole propose un joli petit container qui rox les poneys ! Vous pouvez le lancer comme \u00e7a :<\/p>\n<pre>## telecharger la derniere image\ndocker pull openmole\/openmole:8.0-SNAPSHOT\n## cree un conteneur avec les droit d\u00e9criture sur le dossier monte\ndocker run -u root  -v \/root\/openMole_workSpace:\/var\/openmole openmole\/openmole:8.0-SNAPSHOT chown -R openmole:openmole \/var\/openmole\/\n## lancer le contener en mode detache\ndocker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8443 -v \/root\/openMole_workSpace:\/var\/openmole\/ openmole\/openmole:8.0-SNAPSHOT\n\n<\/pre>\n<h2>Etape 2 : le plug-in cormas pour OpenMole<\/h2>\n<p>Voil\u00e0 la primitive cormas n&rsquo;est pas directement int\u00e9gr\u00e9e \u00e0 OpenMole, il faudra donc <a href=\"https:\/\/jenkins.iscpif.fr\/job\/cormas-plugin-8dev\/\">t\u00e9l\u00e9charger le plug-in<\/a>, et l&rsquo;importer en utilisant le bouton idoine (la prise \u00e9lectrique) dans la barre d&rsquo;outils en haut.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-461 aligncenter\" src=\"http:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-37-04-300x156.png\" alt=\"\" width=\"300\" height=\"156\" srcset=\"https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-37-04-300x156.png 300w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-37-04-768x399.png 768w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-37-04.png 890w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2>Etape 3 : Le script OpenMole<\/h2>\n<p>Une fois que le plug-in est install\u00e9, il ne reste plus qu&rsquo;\u00e0 ex\u00e9cuter un script. Pour se simplifier la vie, on utilisera pour l&rsquo;exemple un mod\u00e8le charg\u00e9 par d\u00e9faut dans cormas : le mod\u00e8le des pompiers. Pour ceux qui n&rsquo;ont pas une petite id\u00e9e ce que c&rsquo;est, on a un automate cellulaire dont les cellules passe de arbre \u00e0 brul\u00e9 et des agents pompier qui vont essayer d&rsquo;\u00e9teindre l&rsquo;incendie.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-462\" src=\"http:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-40-50-300x175.png\" alt=\"\" width=\"300\" height=\"175\" srcset=\"https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-40-50-300x175.png 300w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-40-50-768x448.png 768w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_18-40-50.png 833w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Vous pouvez maintenant cr\u00e9e un <em>script.oms<\/em> qui sera executable par OpenMole.<\/p>\n<pre>\/\/ OpenMole Variable definition.\n\/\/ Those variables will be populated in openMole\n\/\/ and send in JSON to Pharo\/Cormas\n\nval seed = Val[Int]\n\nval numberOfFires = Val[Int]\nval numberOfFiremen = Val[Int]\nval percentageOfTrees = Val[Double]\nval dimensionMin = Val[Int]\nval dimensionMax = Val[Int]\nval nbTrees = Val[Int]\n\n\/\/ The CORMASTask take in parameters the class and method able to\n\/\/ launch our simulation. In OUr case using the Cormas-Model-FireAutomata\n\/\/ we run a methods build for OpenMole. You can take a look.\n\/\/ set() allow you to pass some other thing to your task. You can pass :\n\/\/ * your model as a file.st\n\/\/ * inputs from OpenMole Variable\n\/\/ * outputs as an array\n\/\/ * defined parameters how doesn't change between simulation.\n\nval model = CORMASTask(\"CMFireAutomataModel simuOpenMole\") set (\n\/\/resources += workDirectory \/ \"Cormas-Model-FireAutomata.st\",\ninputs += seed,\ncormasInputs += numberOfFires,\ncormasInputs += numberOfFiremen,\ncormasInputs += percentageOfTrees,\ncormasInputs += dimensionMin,\ncormasInputs += dimensionMax,\ncormasOutputs += nbTrees,\n\noutputs += (seed, numberOfFires, numberOfFiremen, percentageOfTrees, dimensionMin, dimensionMax),\n\nnumberOfFires := 3,\nnumberOfFiremen := 10,\npercentageOfTrees := 0.65,\ndimensionMin := 60,\ndimensionMax := 80\n)\n\n\/\/ With the DirectSampling() method you define an easy wait to generate\n\/\/ a sampling for numberOfFires between 1 to 10.\nDirectSampling(\nevaluation = model hook CSVHook(workDirectory \/ \"results.csv\"),\nDirectSampling(\n  evaluation = model hook CSVHook(workDirectory \/ \"results.csv\"),\n  sampling = (numberOfFires in (1 to 10)) x\n             (seed in (UniformDistribution[Int]() take 10))\n)<\/pre>\n<p>Dans ce script la partie propre \u00e0 Cormas est bien s\u00fbr la <em>CORMASTask()<\/em>. Elle devra contenir l&rsquo;ensemble des instructions qui seront pass\u00e9es au docker de cormas. Dans l&rsquo;exemple ici, nous fixons tous les param\u00e8tres par d\u00e9faut. C&rsquo;est dans la m\u00e9thode <em>DirectSampling()<\/em> que l&rsquo;on va faire varier le nombre de feux a l&rsquo;initialisation et qu&rsquo;on d\u00e9finira le nombre de r\u00e9plications du mod\u00e8le.<\/p>\n<h2>Etape 4 : passer \u00e0 l&rsquo;\u00e9chelle<\/h2>\n<p>\u00c0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente, on utilise un seul thread de l&rsquo;ordinateur. Pour passer \u00e0 l&rsquo;\u00e9chelle rien de plus simple, il faut simplement modifier la fin du script :<\/p>\n<pre>val env = LocalEnvironment(2)\n\n\/\/ With the DirectSampling() method you define an easy wait to generate\n\/\/ a sampling for numberOfFires between 1 to 10.\nDirectSampling(\nevaluation = model on env hook CSVHook(workDirectory \/ \"results.csv\"),\nsampling = (numberOfFires in (1 to 10)) x\n(seed in (UniformDistribution[Int]() take 10))\n)<\/pre>\n<p>On d\u00e9finit une variable env qu&rsquo;on va ensuite appel\u00e9e dans \u00e9valuation. Notre variable env fera alors tourner les mod\u00e8les en parall\u00e8le sur &#8230; 2 thread. Si vous avez acc\u00e8s \u00e0 plus en local, n&rsquo;h\u00e9sitez pas \u00e0 pousser. Enfin si vous avez la chance d&rsquo;avoir acc\u00e8s \u00e0 un cluster il ne vous reste plus qu&rsquo;a explorer les diff\u00e9rents environnements pris en charge par OpenMole.<\/p>\n<p>Voil\u00e0 par exemple sur un cluster SGE, 100 jobs lanc\u00e9s que l&rsquo;on peut monitor dans l&rsquo;interface openMole<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-465\" src=\"http:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-25-26-1024x353.png\" alt=\"\" width=\"604\" height=\"208\" srcset=\"https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-25-26-1024x353.png 1024w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-25-26-300x104.png 300w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-25-26-768x265.png 768w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-25-26.png 1646w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/p>\n<p>et que l&rsquo;on peut voir sur le cluster avec <em>qstat<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-464 size-full\" src=\"http:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-23-18.png\" alt=\"\" width=\"965\" height=\"609\" srcset=\"https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-23-18.png 965w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-23-18-300x189.png 300w, https:\/\/elcep.legtux.org\/wp-content\/uploads\/2018\/08\/Capture-d\u2019\u00e9cran_2018-08-06_19-23-18-768x485.png 768w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/p>\n<h2>R\u00e9f\u00e9rences :<\/h2>\n<ul>\n<li><a href=\"https:\/\/blog.openmole.org\/codingcamp2018\/\">https:\/\/blog.openmole.org\/codingcamp2018\/<\/a><\/li>\n<li><a href=\"https:\/\/jenkins.iscpif.fr\/job\/cormas-plugin-8dev\/\">https:\/\/jenkins.iscpif.fr\/job\/cormas-plugin-8dev\/<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/openmole\/cormas-plugin\">https:\/\/github.com\/openmole\/cormas-plugin<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Je parlais l&rsquo;autre jour de l&rsquo;utilisation de Cormas dans Docker et j&rsquo;avais \u00e9voqu\u00e9 la possibilit\u00e9 d&rsquo;utiliser cette plateforme multi-agent \u00e0 l&rsquo;int\u00e9rieur d&rsquo;openMole pour pouvoir b\u00e9n\u00e9ficier des possibilit\u00e9s de la taupe pour parall\u00e9liser le calcul et explorer des mod\u00e8les. J&rsquo;avais profit\u00e9 de Romain pendant le coding-camp 2018 pour qu&rsquo;on propose une premi\u00e8re version de plug-in cormas &hellip; <a href=\"https:\/\/elcep.legtux.org\/?p=458\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Cormas dans container OpenMole<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[74,50,36],"class_list":["post-458","post","type-post","status-publish","format-standard","hentry","category-sma","tag-cormas","tag-docker","tag-openmole"],"_links":{"self":[{"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=\/wp\/v2\/posts\/458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=458"}],"version-history":[{"count":6,"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=\/wp\/v2\/posts\/458\/revisions"}],"predecessor-version":[{"id":477,"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=\/wp\/v2\/posts\/458\/revisions\/477"}],"wp:attachment":[{"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elcep.legtux.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}