Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    AI-Studio 2.0.0 not starting under Linux

    AI-Studio 2.0.0 not starting under Linux

    dmalcorps
    Member

    Hello,

    As the title suggests, the latest version of AI-Studio does not start under Linux.

    It complains about a missing libtensorflow.so file

    The previous Version 1.7.1 works.

    Any help would be appreciated.

     

    Spoiler

    error [23:28:54] (electron): node:electron/js2c/asar_bundle:5
    /*! no static exports found */function(t,e,r){"use strict";(function(t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.wrapFsWithAsar=void 0;const s=r(/*! buffer */"buffer"),i=r(/*! path */"path"),a=r(/*! util */"util"),o=t._linkedBinding("electron_common_asar"),c=r(/*! module */"module"),f=n.Promise,l=t.env.ELECTRON_NO_ASAR&&"browser"!==t.type&&"renderer"!==t.type,u=t.internalBinding;delete t.internalBinding;const nextTick=(e,r=[])=>{t.nextTick(()=>e(...r))},p=new Map,getOrCreateArchive=t=>{if(p.has(t))return p.get(t);try{const e=new o.Archive(t);return p.set(t,e),e}catch{return null}},h=/\.asar/i,splitPath=e=>{if(t.noAsar||l)return{isAsar:!1};let r=e;return s.Buffer.isBuffer(e)&&(r=e.toString()),"string"!=typeof r?{isAsar:!1}:h.test(r)?o.splitPath(i.normalize(r)):{isAsar:!1}};let _=0;const d=null!=t.getuid?t.getuid():0,y=null!=t.getgid?t.getgid():0,P=new Date,asarStatsToFsStats=function(t){const{Stats:e,constants:n}=r(/*! fs */"fs");let s=n.S_IROTH^n.S_IRGRP^n.S_IRUSR^n.S_IWUSR;return t.isFile?s^=n.S_IFREG:t.isDirectory?s^=n.S_IFDIR:t.isLink&&(s^=n.S_IFLNK),new e(1,s,1,d,y,0,void 0,++_,t.size,void 0,P.getTime(),P.getTime(),P.getTime(),P.getTime())},createError=(t,{asarPath:e,filePath:r}={})=>{let n;switch(t){case"NOT_FOUND":n=new Error(`ENOENT, ${r} not found in ${e}`),n.code="ENOENT",n.errno=-2;break;case"NOT_DIR":n=new Error("ENOTDIR, not a directory"),n.code="ENOTDIR",n.errno=-20;break;case"NO_ACCESS":n=new Error(`EACCES: permission denied, access '${r}'`),n.code="EACCES",n.errno=-13;break;case"INVALID_ARCHIVE":n=new Error(`Invalid package ${e}`);break;default:throw new Error(`Invalid error type "${t}" passed to createError.`)}return n},overrideAPISync=function(t,e,r,n=!1){null==r&&(r=0);const s=t[e],func=function(...t){const e=t[r],n=splitPath(e);if(!n.isAsar)return s.apply(this,t);const{asarPath:i,filePath:a}=n,o=getOrCreateArchive(i);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:i});const c=o.copyFileOut(a);if(!c)throw createError("NOT_FOUND",{asarPath:i,filePath:a});return t[r]=c,s.apply(this,t)};if(n)return func;t[e]=func},overrideAPI=function(t,e,r){null==r&&(r=0);const n=t[e];t[e]=function(...s){const i=s[r],a=splitPath(i);if(!a.isAsar)return n.apply(this,s);const{asarPath:o,filePath:c}=a,f=s[s.length-1];if("function"!=typeof f)return overrideAPISync(t,e,r,!0).apply(this,s);const l=getOrCreateArchive(o);if(!l){const t=createError("INVALID_ARCHIVE",{asarPath:o});return void nextTick(f,[t])}const u=l.copyFileOut(c);if(u)return s[r]=u,n.apply(this,s);{const t=createError("NOT_FOUND",{asarPath:o,filePath:c});nextTick(f,[t])}},n[a.promisify.custom]&&(t[e][a.promisify.custom]=makePromiseFunction(n[a.promisify.custom],r)),t.promises&&t.promises[e]&&(t.promises[e]=makePromiseFunction(t.promises[e],r))};let A;function validateBufferIntegrity(e,n){if(!n)return;A=A||r(/*! crypto */"crypto");const s=A.createHash(n.algorithm).update(e).digest("hex");s!==n.hash&&(console.error(`ASAR Integrity Violation: got a hash mismatch (${s} vs ${n.hash})`),t.exit(1))}const makePromiseFunction=function(t,e){return function(...r){const n=r[e],s=splitPath(n);if(!s.isAsar)return t.apply(this,r);const{asarPath:i,filePath:a}=s,o=getOrCreateArchive(i);if(!o)return f.reject(createError("INVALID_ARCHIVE",{asarPath:i}));const c=o.copyFileOut(a);return c?(r[e]=c,t.apply(this,r)):f.reject(createError("NOT_FOUND",{asarPath:i,filePath:a}))}};e.wrapFsWithAsar=e=>{const n=new Map,logASARAccess=(s,i,a)=>{if(t.env.ELECTRON_LOG_ASAR_READS){if(!n.has(s)){const t=r(/*! path */"path"),i=`${t.basename(s,".asar")}-access-log.txt`,a=t.join(r(/*! os */"os").tmpdir(),i);n.set(s,e.openSync(a,"a"))}e.writeSync(n.get(s),`${a}: ${i}\n`)}},{lstatSync:o}=e;e.lstatSync=(t,e)=>{const r=splitPath(t);if(!r.isAsar)return o(t,e);const{asarPath:n,filePath:s}=r,i=getOrCreateArchive(n);if(!i)throw createError("INVALID_ARCHIVE",{asarPath:n});const a=i.stat(s);if(!a)throw createError("NOT_FOUND",{asarPath:n,filePath:s});return asarStatsToFsStats(a)};const{lstat:l}=e;e.lstat=function(t,e,r){const n=splitPath(t);if("function"==typeof e&&(r=e,e={}),!n.isAsar)return l(t,e,r);const{asarPath:s,filePath:i}=n,a=getOrCreateArchive(s);if(!a){const t=createError("INVALID_ARCHIVE",{asarPath:s});return void nextTick(r,[t])}const o=a.stat(i);if(!o){const t=createError("NOT_FOUND",{asarPath:s,filePath:i});return void nextTick(r,[t])}const c=asarStatsToFsStats(o);nextTick(r,[null,c])},e.promises.lstat=a.promisify(e.lstat);const{statSync:p}=e;e.statSync=(t,r)=>{const{isAsar:n}=splitPath(t);return n?e.lstatSync(t,r):p(t,r)};const{stat:h}=e;e.stat=(r,n,s)=>{const{isAsar:i}=splitPath(r);if("function"==typeof n&&(s=n,n={}),!i)return h(r,n,s);t.nextTick(()=>e.lstat(r,n,s))},e.promises.stat=a.promisify(e.stat);const wrapRealpathSync=function(t){return function(e,r){const n=splitPath(e);if(!n.isAsar)return t.apply(this,arguments);const{asarPath:s,filePath:a}=n,o=getOrCreateArchive(s);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:s});const c=o.realpath(a);if(!1===c)throw createError("NOT_FOUND",{asarPath:s,filePath:a});return i.join(t(s,r),c)}},{realpathSync:_}=e;e.realpathSync=wrapRealpathSync(_),e.realpathSync.native=wrapRealpathSync(_.native);const wrapRealpath=function(t){return function(e,r,n){const s=splitPath(e);if(!s.isAsar)return t.apply(this,arguments);const{asarPath:a,filePath:o}=s;arguments.length<3&&(n=r,r={});const c=getOrCreateArchive(a);if(!c){const t=createError("INVALID_ARCHIVE",{asarPath:a});return void nextTick(n,[t])}const f=c.realpath(o);if(!1!==f)t(a,r,(t,e)=>{if(null===t){const t=i.join(e,f);n(null,t)}else n(t)});else{const t=createError("NOT_FOUND",{asarPath:a,filePath:o});nextTick(n,[t])}}},{realpath:d}=e;e.realpath=wrapRealpath(d),e.realpath.native=wrapRealpath(d.native),e.promises.realpath=a.promisify(e.realpath.native);const{exists:y}=e;e.exists=(t,e)=>{const r=splitPath(t);if(!r.isAsar)return y(t,e);const{asarPath:n,filePath:s}=r,i=getOrCreateArchive(n);if(!i){const t=createError("INVALID_ARCHIVE",{asarPath:n});return void nextTick(e,[t])}const a=!1!==i.stat(s);nextTick(e,[a])},e.exists[a.promisify.custom]=t=>{const e=splitPath(t);if(!e.isAsar)return y[a.promisify.custom](t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);if(!s){const t=createError("INVALID_ARCHIVE",{asarPath:r});return f.reject(t)}return f.resolve(!1!==s.stat(n))};const{existsSync:P}=e;e.existsSync=t=>{const e=splitPath(t);if(!e.isAsar)return P(t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);return!!s&&!1!==s.stat(n)};const{access:A}=e;e.access=function(t,r,n){const s=splitPath(t);if(!s.isAsar)return A.apply(this,arguments);const{asarPath:i,filePath:a}=s;"function"==typeof r&&(n=r,r=e.constants.F_OK);const o=getOrCreateArchive(i);if(!o){const t=createError("INVALID_ARCHIVE",{asarPath:i});return void nextTick(n,[t])}const c=o.getFileInfo(a);if(!c){const t=createError("NOT_FOUND",{asarPath:i,filePath:a});return void nextTick(n,[t])}if(c.unpacked){const t=o.copyFileOut(a);return e.access(t,r,n)}const f=o.stat(a);if(f)if(r&e.constants.W_OK){const t=createError("NO_ACCESS",{asarPath:i,filePath:a});nextTick(n,[t])}else nextTick(n);else{const t=createError("NOT_FOUND",{asarPath:i,filePath:a});nextTick(n,[t])}},e.promises.access=a.promisify(e.access);const{accessSync:I}=e;function fsReadFileAsar(t,r,n){const i=splitPath(t);if(i.isAsar){const{asarPath:t,filePath:a}=i;if("function"==typeof r)n=r,r={encoding:null};else if("string"==typeof r)r={encoding:r};else if(null==r)r={encoding:null};else if("object"!=typeof r)throw new TypeError("Bad arguments");const{encoding:o}=r,c=getOrCreateArchive(t);if(!c){const e=createError("INVALID_ARCHIVE",{asarPath:t});return void nextTick(n,[e])}const f=c.getFileInfo(a);if(!f){const e=createError("NOT_FOUND",{asarPath:t,filePath:a});return void nextTick(n,[e])}if(0===f.size)return void nextTick(n,[null,o?"":s.Buffer.alloc(0)]);if(f.unpacked){const t=c.copyFileOut(a);return e.readFile(t,r,n)}const l=s.Buffer.alloc(f.size),u=c.getFdAndValidateIntegrityLater();if(!(u>=0)){const e=createError("NOT_FOUND",{asarPath:t,filePath:a});return void nextTick(n,[e])}logASARAccess(t,a,f.offset),e.read(u,l,0,f.size,f.offset,t=>{validateBufferIntegrity(l,f.integrity),n(t,o?l.toString(o):l)})}}e.accessSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return I.apply(this,arguments);const{asarPath:s,filePath:i}=n;null==r&&(r=e.constants.F_OK);const a=getOrCreateArchive(s);if(!a)throw createError("INVALID_ARCHIVE",{asarPath:s});const o=a.getFileInfo(i);if(!o)throw createError("NOT_FOUND",{asarPath:s,filePath:i});if(o.unpacked){const t=a.copyFileOut(i);return e.accessSync(t,r)}const c=a.stat(i);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:i});if(r&e.constants.W_OK)throw createError("NO_ACCESS",{asarPath:s,filePath:i})};const{readFile:N}=e;e.readFile=function(t,e,r){const n=splitPath(t);return n.isAsar?fsReadFileAsar(t,e,r):N.apply(this,arguments)};const{readFile:O}=e.promises;e.promises.readFile=function(t,e){const r=splitPath(t);if(!r.isAsar)return O.apply(this,arguments);const n=a.promisify(fsReadFileAsar);return n(t,e)};const{readFileSync:g}=e;e.readFileSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return g.apply(this,arguments);const{asarPath:i,filePath:a}=n,o=getOrCreateArchive(i);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:i});const c=o.getFileInfo(a);if(!c)throw createError("NOT_FOUND",{asarPath:i,filePath:a});if(0===c.size)return r?"":s.Buffer.alloc(0);if(c.unpacked){const t=o.copyFileOut(a);return e.readFileSync(t,r)}if(r){if("string"==typeof r)r={encoding:r};else if("object"!=typeof r)throw new TypeError("Bad arguments")}else r={encoding:null};const{encoding:f}=r,l=s.Buffer.alloc(c.size),u=o.getFdAndValidateIntegrityLater();if(!(u>=0))throw createError("NOT_FOUND",{asarPath:i,filePath:a});return logASARAccess(i,a,c.offset),e.readSync(u,l,0,c.size,c.offset),validateBufferIntegrity(l,c.integrity),f?l.toString(f):l};const{readdir:w}=e;e.readdir=function(t,r={},n){const s=splitPath(t);if("function"==typeof r&&(n=r,r={}),!s.isAsar)return w.apply(this,arguments);const{asarPath:a,filePath:o}=s,c=getOrCreateArchive(a);if(!c){const t=createError("INVALID_ARCHIVE",{asarPath:a});return void nextTick(n,[t])}const f=c.readdir(o);if(f)if(r.withFileTypes){const t=[];for(const r of f){const s=i.join(o,r),f=c.stat(s);if(!f){const t=createError("NOT_FOUND",{asarPath:a,filePath:s});return void nextTick(n,[t])}f.isFile?t.push(new e.Dirent(r,e.constants.UV_DIRENT_FILE)):f.isDirectory?t.push(new e.Dirent(r,e.constants.UV_DIRENT_DIR)):f.isLink&&t.push(new e.Dirent(r,e.constants.UV_DIRENT_LINK))}nextTick(n,[null,t])}else nextTick(n,[null,f]);else{const t=createError("NOT_FOUND",{asarPath:a,filePath:o});nextTick(n,[t])}},e.promises.readdir=a.promisify(e.readdir);const{readdirSync:m}=e;e.readdirSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return m.apply(this,arguments);const{asarPath:s,filePath:a}=n,o=getOrCreateArchive(s);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:s});const c=o.readdir(a);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:a});if(r&&r.withFileTypes){const t=[];for(const r of c){const n=i.join(a,r),c=o.stat(n);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:n});c.isFile?t.push(new e.Dirent(r,e.constants.UV_DIRENT_FILE)):c.isDirectory?t.push(new e.Dirent(r,e.constants.UV_DIRENT_DIR)):c.isLink&&t.push(new e.Dirent(r,e.constants.UV_DIRENT_LINK))}return t}return c};const{internalModuleReadJSON:F}=u("fs");u("fs").internalModuleReadJSON=t=>{const r=splitPath(t);if(!r.isAsar)return F(t);const{asarPath:n,filePath:i}=r,a=getOrCreateArchive(n);if(!a)return[];const o=a.getFileInfo(i);if(!o)return[];if(0===o.size)return["",!1];if(o.unpacked){const t=a.copyFileOut(i),r=e.readFileSync(t,{encoding:"utf8"});return[r,r.length>0]}const c=s.Buffer.alloc(o.size),f=a.getFdAndValidateIntegrityLater();if(!(f>=0))return[];logASARAccess(n,i,o.offset),e.readSync(f,c,0,o.size,o.offset),validateBufferIntegrity(c,o.integrity);const l=c.toString("utf8");return[l,l.length>0]};const{internalModuleStat:S}=u("fs");if(u("fs").internalModuleStat=t=>{const e=splitPath(t);if(!e.isAsar)return S(t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);if(!s)return-34;const i=s.stat(n);return i?i.isDirectory?1:0:-34},"win32"===t.platform){const{mkdir:t}=e;e.mkdir=(e,r,n)=>{"function"==typeof r&&(n=r,r={});const s=splitPath(e);if(s.isAsar&&s.filePath.length>0){const t=createError("NOT_DIR");nextTick(n,[t])}else t(e,r,n)},e.promises.mkdir=a.promisify(e.mkdir);const{mkdirSync:r}=e;e.mkdirSync=function(t,e){const n=splitPath(t);if(n.isAsar&&n.filePath.length)throw createError("NOT_DIR");return r(t,e)}}function invokeWithNoAsar(e){return function(){const r=t.noAsar;t.noAsar=!0;try{return e.apply(this,arguments)}finally{t.noAsar=r}}}overrideAPI(e,"copyFile"),overrideAPISync(e,"copyFileSync"),overrideAPI(e,"open"),overrideAPISync(t,"dlopen",1),overrideAPISync(c._extensions,".node",1),overrideAPISync(e,"openSync");const overrideChildProcess=t=>{const{exec:e,execSync:r}=t;t.exec=invokeWithNoAsar(e),t.exec[a.promisify.custom]=invokeWithNoAsar(e[a.promisify.custom]),t.execSync=invokeWithNoAsar(r),overrideAPI(t,"execFile"),overrideAPISync(t,"execFileSync")},D=new WeakSet;if(t.env.ELECTRON_EAGER_ASAR_HOOK_FOR_TESTING)overrideChildProcess(r(/*! child_process */"child_process"));else{const t=c._load;c._load=(e,...r)=>{const n=t(e,...r);if("child_process"===e&&!D.has(n)){D.add(n),overrideChildProcess(n)}return n}}}}).call(this,r(/*! /internal/common/webpack-provider */"./lib/common/webpack-provider.ts").process,r(/*! /internal/common/webpack-provider */"./lib/common/webpack-provider.ts")._global)},"./lib/asar/init.ts":

    Error: libtensorflow.so.2: cannot open shared object file: No such file or directory
    at process.func [as dlopen] (node:electron/js2c/asar_bundle:5:1812)
    at Module._extensions..node (node:internal/modules/cjs/loader:1203:18)
    at Object.func [as .node] (node:electron/js2c/asar_bundle:5:2039)
    at Module.load (node:internal/modules/cjs/loader:988:32)
    at Module._load (node:internal/modules/cjs/loader:829:12)
    at c._load (node:electron/js2c/asar_bundle:5:13343)
    at Module.require (node:internal/modules/cjs/loader:1012:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/tmp/.mount_BME AILTUkca/resources/app.asar/node_modules/@tensorflow/tfjs-node/dist/index.js:60:16)
    at Module._compile (node:internal/modules/cjs/loader:1118:14) {
    code: 'ERR_DLOPEN_FAILED'
    }
    info [23:28:54] (electron): Exit forked server process (1, null)

     

     

    3 REPLIES 3

    BSTRobin
    Community Moderator
    Community Moderator

    Hi dmalcorps,

    You can install tensorflow library under Linux.

    Well yes, that works (there are other bugs, but i can work with that), but that should not be necessary. AI-Studio is packaged as an appimage, it should be selfcontained and bring all its needed dependencies with it. That worked for the previous version and the current windows version. Neither of them need an additional installation step. The documentation does not mention any need to install third party libraries.

    The missing tensorflow library is a packaging bug, plain and simple. Is there a bugtracker i could actually report this to?

    BSTRobin
    Community Moderator
    Community Moderator

    Hi dmalcorps,

    The new BME AI-Studio software version uses a third-party library tensorflow, the third-party library is not part of the BME AI-Studio software, so the release package does not contain tensorflow, and needs to be installed manually.

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist