Creating Your Dream House With Home Style Software Programs

In the olden days, if you want to design your home or parts of your home, you need to hire and consult professional such as architect and engineers to create you a house design. But today, with the enhancement of technology, you can create your house design project without having an progress skill of an architect and engineer. To create or to plan a project for the house, there are many soft wares for home design that you can try. Some of them are usually CAD Pro Program, Chief Structures Software Program, Google SketchUp 6 software applications, and 3D Home Architect Décor & Design software program. Each of the applications offers different features and different benefits by it.

Computer Aided Design (CAD) Professional is a drafting software program that can be used intended for designing a house professionally. CAD provides a full feature drafting software and presentation that enable any designers, whether you are an amateur or professional, to create a blueprint in a short time. Though lots of people assume that it’s difficult to be used but actually there are a lot of advantages provided by this system such as: you can view ad print your own floor plans in a professional way and very quick, you can customize plan and project so you can suit this with your detailed needs. Even better, it also works excellently when you combine this with Windows Program.

Chief Architecture is a professional house design computer software. Its unique feature lies on its itemized costs estimate reviews that enable you to know how much expenses are calculated when you build a house so you can estimate the budget you have to get ready before building your house. It also is completed with 1, 000 page reference point of useful tips so that the style process can be more effective.

Google SketchUp 6 is software that offers straightforward tool that can provided you with detailed 3D options in creating you house. The benefit of using this program is you can create as detail or fundamental as you want while creating your house.
If you beloved this article so you would like to acquire more info relating to please visit our website.
This software is for free.

An additional program that you can try to design your home is 3D Home Architect Décor & Design. This is a software program stage to step wizard features that will enable you to create a house design simply and effectively. It offers thousands of add-ons such as colors, materials, and materials for your options in planning building. It also comes with Architect Ability features that enable you design your own roofing, house foundation, and even electrical wiring layout.

With various house design software programs, creating a house design project can be very easy and fast. Even if you choose to hire professional in doing the job, you still can gain some benefits with the programs; you can calculate the costs so that you know your contractor give you the reasonable price for your house layout and then you¡¯re also able to find what kind of house that you like to build for your own house.

Not every Landscaping Software Programs Are Created Equal!

Landscape designs software programs will help you to create the garden of your dreams but there are some programs that are a complete waste of money. What you obviously need to discover is which software program is good before you buy them.

Unfortunately, a lot of the landscaping software programs that are commercially readily available for the regular consumer are not really great. In reality, some of these programs are just ordinary useless, and to buy them is to place your money down the drain! They will have ineffective cartoon type drawings that are not clear and that will not really serve any objective at all. On the other hand, there are some of the more pricey commercial grade landscaping programs that will blow you away using what they can do. What you may be looking for, is a mid priced product that will just does what you need, and does it well.

Please consider that when you are using a software program that it won’t move out there and do it for you (it would be very expensive if it did! ), it is only a tool for you to make your ideas a reality. If you are thinking of purchasing landscaping software so that you can just have your yard designed for you, then do not even bother buying it. In the event that on the other hand you have some splendid ideas in your head and you want to get them laid out in front of you, then a good landscaping software program might be for you after all. If you are in short supply of ideas, go to a good outdoor landscape designs design website or get a book.

Before you commit to buying any computer software make sure you know exactly what it does. No longer pay for things you will never use. This will let you see if the program can help you attain what you want. You should try to choose a gardening software program that has good graphics. Toons are pretty useless! The better the particular graphics are on your landscaping software program the easier it will be to envision the end result. Remember that this is the end goal of any kind of landscaping program. If the landscaping application is rubbish, then you could be better off utilizing the drawing programs that are already on your pc.

Lets face it though, if you are looking for software, if there are two landscaping software programs and they look exactly the same and they each have the tools that you might want but one is cheaper, which one are you going to chose!
If you have any queries relating to wherever and how to use, you can get in touch with us at our own web-page.

Popular features of a Good Software Program

Generating exceptional software programs is an obligation which computer programmers must constantly obtain. For that reason, there are a number of factors that may be evaluated to determine if software programs acquire the intended status. These factors include:

Code versatility

Since software codes for different programs tend to be identical, while some may accommodate a few alterations to generate a totally different end result; there’s need for programmers to write codes that can easily get adjusted for use in disparate projects. Such codes will act as a solution what type can readily revisit when creating brand new projects.

With such codes in place, you will be able to save time thereby making numerous software programs in record period. In addition to that, you should have a large number of classes utilizing a given utility class. In this fashion, the program will have the capacity to solve several problems without demanding for scores of code alterations. On the other hand, you shouldn’t use too many classes since they might find yourself complicating the code instead of maintaining it simple.

Ease of maintenance

The creating software solutions doesn’t always end with the completion of a specific plan. Generally, all software programs must be taken care of or upgraded on a regularly basis to add extra functions and enhance flexibility. As a software developer, you need to focus on making use of simplified codes or risk future challenges when the need for software upgrading arises. Avoid tough coding your solutions by using easy to read codes even though the process may find yourself becoming tiresome and time consuming.

Shell autonomy

If the software will feature a number of applications, you should ensure that each shell is not dependent on another to operate suitably. However , this ability need to only be applied to applications that hold the capacity to work without depending on other functions.

When different functions work independently, they allow designers to add and remove features the fact that program may need or not need without having distorting the underlying code composition.

Software program Portability

In software development, moveability refers to the ease of transferring your program from one platform to another. Cross programs are able to work on different platforms without having causing errors. They can run on Windows, Mac and UNIX platforms with no experiencing various kind hitches. Because of that option, you should always make certain that the majority of your software programs can be used on various platforms.

Finally, you must standardize your code to the level that each creator will understand the objectives behind the particular program’s development.
In the event you beloved this informative article and also you would like to acquire more information concerning i implore you to pay a visit to the page.
In the event that you are unable to implement a certain feature, you can let other developers have your program code to make the necessary adjustments. If you never ever followed the standard coding procedure, your job will be considered a mess which can only be solved by redoing the entire code.

hospital veterinário

Localizado na zona sul da cidade de São Paulo, na Rua Nossa Senhora da Saúde número 366, Jardim Previdência. Sendo conhecido por sua dedicação, capacitação fazendo que o hospital seja certamente uma referência em atendimentos.

Priorizando um atendimento humanizado e personalizado aos nossos pacientes para promovermos uma recuperação breve e com conforto.

Sendo assim o Hospital Veterinário São Paulo Saúde oferece diversos tipos de procedimentos, dos mais simples aos mais complexos dentro da Veterinária.
Contamos com diversas especialidades, com o objetivo de proporcionar serviços que gerem saúde e qualidade de vida aos animais.

Portanto nossos equipamentos são modernos, os profissionais atualizados, garantindo um tratamento específico através de de monitores multiparamétricos, bombas de infusão para fluidoterapia, alimentação enteral, microenteral e parenteral, gaiolas de oxigênio, aparelho de pressão arterial, ultrassom de mesa, além de exames complementares, como hematócrito, urina, lactato, gasometria, eletrólitos e bioquímica.

O Hospital Veterinário Saúde, possui consultórios, sala de emergência, internação de animais, centro cirúrgico.

Possuímos uma sala de Unidade de Terapia Intensiva (UTI), que vem acrescentar a nossa internação todo suporte necessário para atender e internar animais que precise de tratamento intensivo, medicações injetáveis, realização de exames complementares e supervisão constante de um Médico Veterinário.

Le principe de la micro-soudure par résistance par point

En soudage par résistance par point, deux électrodes de cuivre énergiquement refroidies serrent entre elles les pièces à assembler. Un échauffement se crée par effet Joule dans toute l’épaisseur despièces au droit des électrodes au passage du courant à basse tension.
Les résistances de contact entre électrodes et pièces doivent être le plus faible possible, l’échauffement maximal se produit à l’interface des pièces, et par ce contact se forme un noyau de métal liquide qui est maintenu en place grâce à l’effort exercé par les électrodes. Cet effort est prépondérant, car il joue un rôle majeur pendant toutes les phases du cycle de soudage.

Le rôle de l’effort exercé par les électrodes pendant le cycle de soudage

L’effort sur électrodes dans un premier temps, au serrage, rapproche les pièces à souder l’une contre l’autre provoquant ainsi un contact à l’endroit où l’on veut effectuer le point de soudure.
Puis, pendant le passage du courant, cet effort maintient le bon serrage. Il permet aussi de s’opposer à la destruction du creuset plastique contenant le noyau de métal en fusion, sous l’influence de la dilatation.
Sur la troisième phase de soudage, au refroidissement, pendant la solidification du noyau, l’effort est généralement supérieur à celui appliqué lors des deux premières phases. Il permet de diminuer le volume de la retassure et d’affiner le grain du métal, ce qui permet d’en augmenter les caractéristiques mécaniques.
Ce cycle de soudage élémentaire peut parfois être plus complexe. En effet, il peut comporter par exemple des efforts variables en fonction de plusieurs paramètres comme les phases sur les électrodes, les périodes de pré et de post-chauffage, la trempe, le recuit, etc.

If you are you looking for more in regards to soudure par point look at the internet site.


Les domaines d’application de la soudure par résistance par points

Le soudage par résistance par points s’applique principalement aux assemblages à recouvrement sur tôles d’épaisseurs identiques ou d’épaisseurs différentes. Le soudage par résistance par points permet aussi, sur tôles minces, de pouvoir superposer et souder en même temps trois ou quatre épaisseurs ensemble.
La technique d’assemblage par point se prête parfaitement à l’automatisation et se caractérise surtout par sa rapidité d’exécution, avec un temps de soudage de 35 centièmes par seconde sur acier d’une épaisseur de 2 mm et une cadence de 500 points de soudure par minute.
De plus, la micro-soudure par résistance par point est applicable à divers matériaux tels que les aciers non alliés, faiblement alliés ou fortement alliés, alliages légers, nickel et alliages de nickel…
Le soudage par point trouve également des applications de choix en construction automobile, en matériel ferroviaire, en électroménager, en mobilier et dans l’emballage métallique.

Truths About Fast Fat Loss Weight Options

Even though you have excess weight you want to shed on your body, it does not make any feeling for you to resort to extreme methods for losing weight fast. Not only will you be dissatisfied that you have achieved nothing, you will also miss out on some very useful and effective quick fat loss weight solutions. Losing weight is just not difficult, provided that you follow a few simple tips. You will find that achieving and maintaining that ideal body weight is simple.

‘Slow-Carbohydrates’ Diets

The first tip with regards to fast fat loss is not to take low-carbohydrates diets, but ‘slow-carbohydrates’ diets. Although certain diets, such as Atkins, will help you in shedding weight in double quick time, they can at the same time be hazardous to your health. This can be disheartening because you will find that the you will obtain the weight back faster than imaginable, since such diets are not supportable over the long haul. It is better to eat appropriate carbohydrates, and thus eating ‘slow-carbohydrates’ diet plans will ensure stable blood-sugar ranges, and is a natural fast weight loss program you can undertake.

Include beans in each meal for your fast fat loss weight regime. Eating beans, as well as legumes, in each meal will not only create your stomach full, but it also retains your blood-sugar levels stable. Moreover, it will also help you last from one food to the next without taking unnecessary snacks in between.

Stick to a lifestyle that will promotes better health for your fast weight loss regime.
If you loved this post and you would certainly such as to receive additional facts regarding نظام الكيتو دايت kindly check out our own web-site.
Rather than gorging yourself with fast food and food that is high in sugar content, take a well balanced diet which is low on glycogenic index. It helps you to relax (live a less stressful life), with the same time, achieve the desired results as far as fast fat loss weight is concerned. If you are in need of fast weight loss solutions, the desire to get instant results can often guide them astray. Rather than jumping in to quick-fix solutions, it is wiser to follow along with the low glycogenic diets, which currently has proven results among those that are overweight.

There is an useful publication known as ‘Complete Idiot’s Diet’. This publication enlightens and helps people looking for fast fat loss weight solutions. However the title may sound ‘stupid’, it is fully packed with useful simple and eays steps practical steps which you can learn. An online diet generator is also included to assist you in your fast fat loss weight system.

Applications of resistance welding

• Resistance welding is used in the automotive industry. It is specially used to design nuts and bolts.
• Seam welding is used to make water tanks and boilers.
• Resistance welding is used in the welding of tubes and pipes

Types of resistance welding

The process of resistance welding is classified into many variants depending upon the shape of the workpiece and form of electrodes. Commonly used resistance welding processes are
• Spot welding
• Projection welding
• Seam welding
• Butt welding

Spot welding

It is a predominant process in the automobile industry. It is used in the assembling of automobile bodies and its large components. It is used for the manufacturing of furniture and other domestic products. In this process, the current and heat generation is localized in the form of electrode.

If you are you looking for more info in regards to resistance welding visit the site.


Projection welding

This type of resistance welding is done with specially designed electrodes to shift the shape of the workpiece. Projection welding is used in electrical equipment, electronics, automotive, and construction industries. This process is used in the manufacturing of sensors, valves, and pumps.

Seam welding

In this resistance welding process, the joints are leak-tight by continuous opposing force with electrodes consisting of rotatory wheels. Seam welding is applied in manufacturing containers, radiators and heat exchangers, etc.

Butt welding

It is a forging operation applied to the workpiece when heated. Racks it is a resistance welding process to join metal plates or bars with an applied force of electrodes clamping the workpiece at the ends. It is applied for the manufacturing process of wheel rims, wire joints, and railway track joints.

Equipment for the micro welding process

As micro welding is done on a minute scale so it needs special equipment and machines. The micro welder should have proper skills of using all that equipment. The success of the process completely depends on the efforts made by the welder. Some of the necessary equipment required for this process is:

• A micro welder needs minute wires foe welding having a diameter of 0.005 mm. this is an extremely precise process so some of the precise machines should be available to work on.
• As this process is done miniature scale so a welder needs a microscope to perform this welding. The expert micro welder maintains the amount of the heat needed for the process.
• The welders also need some miniature tools to place the filler metal properly where required. These tools provide the utmost precision needed in the process.

If you beloved this report and you would like to get much more details relating to micro welding kindly visit the page.


Types of micro welding

The micro welding is now done by many methods. For instance, the application of pressure, electrostatics, and ultrasonic, etc. The types of micro welding are as follows:

Micro laser welding

This micro welding is performed by laser. The laser is in the solid-state. Many automated programmable machines are used in this process. These machines are used to perform a precise process. This micro laser welding provides the best quality joints. The laser in micro welding ensures the deep welding process due to its penetration power. This technique needs no pressure. There is no need for a vacuum chamber for laser micro welding. The laser can travel through the air easily. This technique is very useful as it does not produce any gas that can contaminate the environment. There is no need to use shielding gas for laser micro welding. This method can be used for the welding of the highly reactive metals also.


De nombreux locataires d’ appartements souhaitent également améliorer l’apparence de la salle de bain. Même le remplacement de la pomme de douche ou des boutons de l’évier peut rendre une pièce obsolète brillante et neuve. De nouveaux sièges de toilette peuvent également améliorer l’apparence, et vous n’avez généralement pas besoin de demander au propriétaire avant de terminer ce projet. Si vous avez besoin de plus d’espace pour ranger les serviettes, les articles de toilette et autres nécessités, vous voudrez peut-être ajouter une étagère pouvant s’asseoir au-dessus des toilettes sans prendre trop de place. Une armoire à pharmacie peut également ajouter de l’espace pour stocker des médicaments et des produits de premiers soins.
C’est quelque chose qui nécessitera l’approbation du propriétaire, mais beaucoup ne s’y opposeront pas car le nouveau revêtement de sol peut augmenter la valeur de l’espace. Si vous détestez absolument le tapis ou les planchers de votre appartement et que vous avez un peu d’argent supplémentaire à investir dans un projet de rénovation appartement paris, vous voudrez peut-être envisager de le remplacer. Dans certains cas, un propriétaire vous remboursera les travaux que vous avez effectués et les dépenses engagées pendant le projet. Un nouveau revêtement de sol peut donner à un vieil appartement un aspect neuf, il vaut donc la peine d’être pris en considération.
L’une des principales raisons pour lesquelles un appartement peut se sentir à l’étroit est la mauvaise conception des meubles dans l’espace. Si vous sentez que votre maison devient trop petite pour vos biens, cela vaut la peine de prendre du temps pour déplacer certaines choses et améliorer la circulation. Si votre chambre est petite, pensez à installer un lit queen-size au lieu de prendre beaucoup de place avec un lit king-size. Vous pourriez également être en mesure de vous débarrasser de certaines pièces et de les remplacer par des alternatives peu encombrantes.

If you loved this post and you would like to receive extra information pertaining to renovation appartement paris beaverco kindly visit the webpage.

Si vous avez une salle à manger dans laquelle vous ne mangez jamais, envisagez de la transf

google bert

Servir Google BERT en production à l’aide de Tensorflow et ZeroMQ

Ceci est un article expliquant la philosophie de conception derrière mon projet open-source bert-as-service, un service d’encodage de phrases hautement évolutif basé sur Google BERT et ZeroMQ. Il permet de mapper une phrase de longueur variable à un vecteur de longueur fixe. Si vous ne l’avez pas encore vérifié,
Quand nous regardons en arrière sur 2018, l’une des plus grandes nouvelles dans le monde du ML et de la NLP est les représentations de l’encodeur bidirectionnel de Google de Transformers , alias BERT. BERT est une méthode de pré-formation des représentations de langage qui permet d’obtenir non seulement des résultats de pointe mais aussi des records sur un large éventail de tâches PNL, telles que la compréhension en lecture machine .

If you liked this article and you simply would like to receive more info relating to google bert nicely visit the web page.

Pour mon équipe au Tencent AI Lab, le BERT est particulièrement intéressant car il fournit une nouvelle façon de représenter la sémantique du texte en utilisant des vecteurs de longueur fixe à valeur réelle. Pour de nombreuses applications NLP / AI du monde réel sur lesquelles nous travaillons, une représentation vectorielle efficace est la pierre angulaire. Par exemple, dans la recherche d’informations neuronales, la requête et le document doivent être mappés sur le même espace vectoriel, afin que leur parenté puisse être calculée en utilisant une métrique définie dans cet espace, par exemple la distance euclidienne ou cosinusoïdale. L’efficacité de la représentation détermine directement la qualité de la recherche.
Donc, si de nombreuses applications NLP s’appuient sur des fonctionnalités sémantiques, alors pourquoi ne construisons-nous pas une infrastructure de codage de phrases pouvant servir plusieurs équipes? Cette idée, malgré sa simplicité et sa simplicité, n’est vraiment pratique que récemment. Parce que de nombreux algorithmes d’apprentissage en profondeur adaptent la représentation vectorielle à une tâche ou un domaine spécifique. Par conséquent, la représentation d’une application / équipe n’est pas vraiment réutilisable pour d’autres applications / équipes. Au contraire, le BERT (ainsi que ELMo et ULMFit ) décompose une tâche PNL en étapes de pré – entraînement indépendant de la tâche et de réglage fin spécifiques à la tâche , où la pré-formation apprend un modèle qui est suffisamment général et peut être réutilisé dans de nombreuses tâches en aval.
Au cours des dernières semaines, j’ai mis en œuvre cette idée en tant que projet open sourcebert-as-service . Il encapsule le modèle BERT comme un service de codage de phrases, permettant de mapper une phrase de longueur variable à un vecteur de longueur fixe. Il est optimisé pour la vitesse d’inférence, la faible empreinte mémoire et l’évolutivité. La et couvre déjà très bien l’utilisation et les API. Dans cet article, je vais me concentrer sur les détails techniques, en particulier la philosophie de conception de ce projet, qui, je l’espère, peut vous offrir quelques références lorsque vous servez un modèle Tensorflow en production.
● Récapitulatif BERT
● BERT en tant que service
● Recherche: trouver un incorporation / encodage efficace
● Ingénierie: créer un service évolutif
○ Découplage du BERT et du réseau en aval
○ Servir avec une vitesse d’inférence rapide
○ Servir avec une faible latence
○ Servir avec une évolutivité élevée
● Sommaire
Récapitulatif BERT
Il y a plusieurs points forts dans le BERT: réseau d’auto-attention multi-têtes, double tâche de formation (c’est-à-dire modèle de langage masqué et prédiction de phrase suivante), formation TPU à grande échelle. Toutes ces fonctionnalités réunies font de ce modèle NLP un record. Mais les bonnes performances ne sont qu’une partie de l’histoire. Ce que j’aime le plus, c’est le modèle de conception de BERT: il forme un modèle de «compréhension du langage» à usage général sur un grand corpus de texte (par exemple Wikipedia), puis utilise ce modèle pour une variété de tâches de PNL qui nous intéressent. Contrairement à l’apprentissage de bout en bout, le BERT décompose une tâche d’apprentissage PNL traditionnelle en deux étapes: pré – formation et réglage fin :
● La pré-formation apprend à partir de données en texte brut qui sont accessibles au public sur le Web, dans le but de capturer la grammaire générale et les informations contextuelles d’une langue.
● Le réglage fin apprend d’une tâche spécifique (par exemple l’analyse des sentiments, la traduction automatique, la compréhension de la lecture) ou des données d’un domaine particulier (par exemple les documents juridiques).

Cependant, la pré-formation est une procédure longue qui nécessite beaucoup de ressources de calcul. Selon Google, il leur a fallu quatre jours sur 4 à 16 Cloud TPU pour terminer la pré-formation. C’est bien au-delà de la patience de la plupart des chercheurs et ingénieurs (et bien sûr des propriétaires de produits). Heureusement, c’est une chose unique pour chaque langue, et Google a publié des modèles BERT pré-formés pour plusieurs langues . En pratique, vous pouvez simplement télécharger un BERT pré-formé, alimenter sa représentation de sortie vers un réseau en aval personnalisé à votre tâche. Notez que les informations générales sur la langue ayant déjà été mémorisées dans le BERT pré-formé, un réseau léger en aval est souvent tout à fait suffisant. Vous pouvez également affiner le réseau complet (c’est-à-dire BERT + réseau en aval) de manière de bout en bout.
BERT en tant que service
Que voulons-nous réellement d’un modèle BERT? Dans le domaine IR / recherche, nous voulons la représentation vectorielle de la requête et du document, en l’utilisant pour calculer la similitude ou la parenté entre la requête et le document. Dans les tâches orientées classification, nous voulons utiliser les représentations vectorielles ainsi que les étiquettes pré-annotées pour former un classificateur en aval. Dans le système d’apprentissage d’ensemble, nous voulons que le vecteur BERT fasse partie de notre pool de fonctionnalités, qui est concaténé ensemble pour construire une représentation plus riche. Je te donne un texte, tu me rends un vecteur. Cela conclut une grande partie des besoins de nombreuses équipes d’IA.

De quoi avons-nous besoin d’un «service BERT»? Vitesse d’inférence rapide, faible encombrement mémoire et évolutivité élevée. C’est l’exigence de base pour le fournisseur de services. Du côté du client (c’est-à-dire d’autres ingénieurs et équipes de produits), le service doit être facile à utiliser. L’API doit être aussi intuitive que vector = encode(texts)sans se soucier d’ autre chose.
Recherche: trouver un incorporation / encodage efficace
Avant de nous salir les mains, réfléchissons d’abord à la façon d’obtenir une incorporation efficace de phrases à partir d’un modèle BERT. Un modèle BERT préentraîné a 12/24 couches, chacune «s’auto-accompagne» sur la précédente et produit un [batch_size, seq_length, num_hidden]tenseur. Si vous n’êtes pas familier avec le concept d’auto-attention, je vous suggère fortement de lire d’abord ce document . Obtenir l’intégration de mots est simple, mais si l’objectif est l’intégration d’une phrase, nous devons regrouper ce [B,T,D]tenseur dans une [B,D]matrice d’intégration. Dans mon précédent article de blog , j’ai parlé de différentes stratégies de mise en commun. Parmi eux, le regroupement moyen, le regroupement maximal, le regroupement hiérarchique ainsi que le regroupement concaténé avg-max peuvent être appliqués directement ici car ils n’introduisent pas de nouveaux paramètres (donc pas de formation supplémentaire).
En dépit de ces stratégies de mise en commun général, si vous lisez le papier Google BERT assez prudent, vous devriez remarquer que deux jetons spéciaux [CLS]et [SEP]sont rembourrés au début et à la fin d’une séquence d’entrée, respectivement. Une fois affiné avec les tâches en aval, l’incorporation de ces deux jetons peut représenter la séquence entière. En fait, cela est explicitement utilisé dans le code source officiel BERT . Ainsi, nous pouvons également les inclure. Cependant, si le modèle BERT est uniquement pré-formé et n’est pas affiné sur une tâche en aval, les intégrations sur ces deux symboles n’ont aucun sens.
Nous avons maintenant un tas de stratégies de mise en commun, à quelle couche devons-nous les appliquer? Empiriquement, on pourrait utiliser la dernière couche, comme dans LSTM / CNN empilés. Cependant, gardez à l’esprit que BERT est un modèle pré-formé avec une cible bipartite: modèle de langage masqué et prédiction de la phrase suivante. La dernière couche est entraînée à s’adapter à cette cible, ce qui la rend trop «biaisée» pour ces deux cibles. Dans un souci de généralisation, nous pourrions simplement prendre l’avant-dernière couche et faire la mise en commun.
Différentes couches BERT capturent différentes informations. Pour voir cela plus clairement, j’ai fait une visualisation sur UCI-News Aggregator Dataset avec préuncased_L-12_H-768_A-12 – formé , où j’échantillonne au hasard 20K titres de nouvelles; obtenir des codages de phrases à partir de différentes couches en utilisant la mise en commun maximale et moyenne, enfin la réduire à 2D via PCA. Il n’y a que quatre classes de données, illustrées en rouge, bleu, jaune et vert.

On peut observer que les couches consécutives ont une représentation similaire, tandis que les premières couches représentent une signification considérablement différente par rapport aux dernières couches. La couche la plus profonde est celle située à côté du mot incorporation. Il peut conserver les informations très originales du mot (sans aucune attention particulière, etc.). D’un autre côté, on peut obtenir les mêmes performances en utilisant simplement l’incorporation de mots. Par conséquent, tout ce qui se trouve entre la première couche et la dernière couche est alors un compromis. L’animation suivante illustre plus clairement la différence entre les calques.

Ingénierie: créer un service évolutif
Heureusement, la mise en commun est le seul problème de recherche auquel nous devons faire face pour le moment. Le reste du travail concerne principalement l’ingénierie.
Découplage du BERT et du réseau en aval
La première chose à faire est de découpler le modèle BERT principal et le réseau en aval. Plus précisément, ce réseau d’attention multi-têtes empilé 12/24 couches doit être hébergé dans un autre processus ou même sur une autre machine. Par exemple, vous pouvez le placer sur une machine GPU au coût par utilisation, desservant plusieurs équipes simultanément. Le réseau / les modèles en aval sont souvent légers et peuvent ne pas avoir besoin de bibliothèques d’apprentissage en profondeur du tout, ils peuvent fonctionner sur une machine CPU ou un appareil mobile.

Le découplage clarifie également le rôle C / S. Lorsque l’extraction de fonctionnalités devient le goulot d’étranglement, faites évoluer le serveur GPU. Lorsque le réseau en aval est le goulot d’étranglement, optimisez le client en ajoutant plus de machines CPU ou en effectuant une quantification. Lorsque les données de formation sont trop anciennes ou dérivées du concept, puis recycler le BERT et contrôler la version du serveur, tous les réseaux en aval bénéficient immédiatement des vecteurs de fonctionnalités mis à jour. Enfin, comme toutes les demandes arrivent au même endroit, votre serveur GPU a moins de cycles d’inactivité et chaque centime est dépensé dignement.
Pour construire la pile de communication, j’utilise ZeroMQ et ses liaisons python PyZMQ , qui offrent une implémentation de messagerie légère et rapide. Vous pouvez envoyer et recevoir un message interprocessus via TCP / IPC / de nombreux autres protocoles simplement comme suit:
import zmq
import zmq.decorators as zmqd

@ zmqd.socket (zmq.PUSH)
def send (sock) :
sock.bind ( ‘tcp: // *: 5555’ )
sock.send ( b’hello ‘ ) # dans un autre processus @ zmqd.socket (zmq.PULL ) def recv (sock) : sock.connect ( ‘tcp: // localhost: 5555’ ) print (sock.recv ()) # montre b’hello ‘

Servir avec une vitesse d’inférence rapide
Le code BERT original publié par Google prend en charge la formation et l’évaluation. Cela introduit certains nœuds auxiliaires qui doivent être supprimés du graphe de calcul avant d’être servis. Notez également que si l’on utilise la k-ème couche pour la mise en commun, tous les paramètres de (k + 1) -th aux dernières couches ne sont pas nécessaires pour l’inférence et peuvent donc être supprimés en toute sécurité également. L’image suivante résume une procédure générale avant de servir un réseau neuronal profond en production.

Plus précisément, le gel remplace toutes les variables par des constantes, c’est-à-dire de tf.Variableà tf.Constant. L’élagage supprime tous les nœuds et bords inutiles du graphique. La quantification remplace tous les paramètres par leurs homologues de moindre précision, par exemple de tf.float32à tf.float16ou même tf.uint8. Actuellement, la plupart des méthodes de quantification sont implémentées pour les appareils mobiles et, par conséquent, on ne peut pas observer d’accélération significative sur les architectures X86.
Tensorflow fournit des API pour le gel et l’élagage. Il suffit de spécifier les nœuds d’entrée et de sortie avant d’optimiser le graphique, tels que:
input_tensors = [input_ids, input_mask, input_type_ids]
output_tensors = [pooled]
Ensuite, faites simplement:
depuis import optimize_for_inference
depuis tensorflow.graph_util import convert_variables_to_constants

# get graph
tmp_g = tf.get_default_graph (). as_graph_def ()

sess = tf.Session ()
# charge les paramètres puis fige (tf.global_variables_initializer ())
tmp_g = convert_variables_to_constants (sess, tmp_g, [ [: -2 ] pour n dans output_tensors])

pruning dtypes = [n.dtype for n in input_tensors]
tmp_g = Optimize_for_inference (tmp_g, [ [: -2 ] for n in input_tensors],
[ [: -2 ] for n in output_tensors],
[ dtype.as_datatype_enum pour dtype dans dtypes], False ) avec tf.gfile.GFile ( ‘optimisé.graphique , ‘ wb ‘ ) comme f: f.write (tmp_g.SerializeToString ())

Servir avec une faible latence
Nous ne voulons pas générer un nouveau modèle BERT chaque fois qu’une nouvelle demande arrive, au lieu de cela, nous voulons générer le modèle une seule fois au début et écouter la demande dans une boucle d’événements. L’appel{…})est une solution, mais il n’est pas assez efficace. De plus, comme le code BERT d’origine est encapsulé avec une tf.EstimatorAPI de haut niveau , nous devons effectuer quelques ajustements pour injecter l’écouteur. Un endroit parfait pour une telle injection est dans le générateur de input_fn, qui est l’élément fondamental de l’ tf.DataAPI.
def input_fn_builder (sock) : def gen () : while True : # request request client_id, raw_msg = sock.recv_multipart () msg = jsonapi.loads (raw_msg) tmp_f = convert_lst_to_features (msg) yield { ‘client_id’ : client_id, ‘input_ids ‘ : [f.input_ids pour f dans tmp_f], ‘ input_mask ‘ : [f.input_mask pour f dans tmp_f], ‘ input_type_ids ‘ : [f.input_type_ids pour f dans tmp_f]}

def input_fn () : return ( (gen, output_types = { ‘input_ids’ : tf.int32, ‘input_mask’ : tf.int32, ‘input_type_ids’ : tf.int32, ‘client_id’ : tf. string}, output_shapes = { ‘client_id’ : (), ‘input_ids’ : ( Aucun , max_seq_len), ‘input_mask’ : ( Aucun , max_seq_len), ‘input_type_ids’ : ( Aucun , max_seq_len)}) .prefetch ( 10 )) return input_fn

Ensuite, on peut simplement appeler:
# Initialize modèle BERT une fois
estimateur = estimateur (model_fn = bert_model_fn)
# keep écouter et de prévoir
pour résultat dans estimator.predict (input_fn_builder (client), yield_single_examples = False ):
send_back (résultat)
Notez que estimator.predict()renvoie un générateur et la boucle for ci-dessus ne se termine jamais. Lorsqu’il y a une nouvelle demande, le générateur préparera les données et les transmettra à l’estimateur. Sinon, le générateur sera bloqué sock.recv_multipart()jusqu’à la prochaine demande.
Les lecteurs attentifs peuvent remarquer .prefetch(10)à la fin de L’ajout du mécanisme de prélecture peut masquer efficacement le temps de préparation du lot (sur le processeur, introduit par convert_lst_to_features()) derrière le temps de prédiction réel (sur le GPU). Lorsque le modèle effectue une prédiction et qu’une nouvelle demande arrive, la non-prélecture sera simplement bloquée yieldjusqu’à la fin de la prédiction, tandis qu’avec .prefetch(10)elle, la préparation des lots se poursuivra jusqu’à ce que 10 lots en attente soient mis en file d’attente pour la prédiction. Dans la pratique, j’ai trouvé que l’ajout prefetchaccélère de 10%. Bien sûr, cela n’est efficace que sur une machine GPU.
Il existe d’autres astuces d’optimisation implémentées dans bert-as-service, y compris activer le compilateur XLA. Les lecteurs intéressés sont encouragés à lire directement la source .
Servir avec une évolutivité élevée
Supposons que plusieurs clients envoient simultanément des demandes à un serveur. La parallélisation sur le travail de calcul est une chose, mais d’abord, comment le serveur devrait-il même gérer la réception? S’il reçoit la première demande, maintenez cette connexion jusqu’à ce qu’il renvoie le résultat; procéder ensuite à la deuxième demande? Que se passe-t-il s’il y a 100 clients? Le serveur doit-il utiliser la même logique pour gérer 100 connexions?
Comme deuxième exemple, considérons qu’un client envoie 10 000 phrases à toutes les 10 ms. Le serveur met en parallèle le travail en sous-tâches et les affecte à plusieurs travailleurs GPU. Puis un autre client se joint à lui, envoyant une phrase par seconde. Instinctivement, ce petit client par lots devrait obtenir le résultat instantanément. Malheureusement, comme tous les travailleurs du GPU sont occupés à calculer et à recevoir du premier client, le deuxième client n’obtiendra jamais de créneau horaire tant que le serveur n’aura pas terminé 100 lots (chacun avec 10 000 phrases) du premier client.
Il s’agit de problèmes d’évolutivité et d’équilibrage de charge lorsque plusieurs clients se connectent à un serveur. Dans bert-as-service, j’implémente un pipeline ventilateur-travailleur-évier équipé de prises push / pull et de publication / abonnement. Le ventilateur agit comme un programmateur de lots et un équilibreur de charge. Il partitionne la grande demande des clients en mini-tâches. Il équilibre la charge de ces mini-emplois avant de les envoyer aux travailleurs. Le travailleur reçoit des mini-travaux du ventilateur et fait l’inférence BERT réelle, envoie finalement le résultat à l’évier. L’ évier recueille la sortie des mini-travaux de tous les travailleurs. Il vérifie l’intégralité de toutes les demandes du ventilateur, publie les résultats complets aux clients.
L’architecture globale est illustrée ci-dessous.

Je dois avouer que ce n’est pas la première chose qui m’est venue à l’esprit. Ce que vous voyez ici est le pipeline après plusieurs itérations, celui qui résout très bien les problèmes d’évolutivité mentionnés ci-dessus. Permettez-moi de l’expliquer en détail.
● Sockets séparés pour envoyer et recevoir sur le client. Par rapport au socket REQ-REP standard (qui est en mode lockstep), le socket PUSH-PULL n’attend pas la réponse avant le prochain PUSH. Le client peut envoyer plusieurs demandes d’affilée, puis demander les résultats ultérieurement. Une fois le calcul terminé, le serveur diffuse le résultat via le socket PUB et utilise les ID client comme en-tête. Le client écoute la diffusion à partir du socket SUB et récupère les abonnements correspondant à sa propre identité.
Il existe au moins deux avantages de la conception PUSH-PULL et PUB-SUB. Tout d’abord, il n’est pas nécessaire de maintenir la connexion active entre le serveur et le client. En tant que client, vous venez de mettre les données à l’emplacement prédéfini, le travail est terminé. Vous savez que quelqu’un (le serveur) le récupérera (via PULL). Vous ne vous souciez pas de savoir si le serveur est vivant ou mort, redémarré ou parallélisé. En tant que serveur, vous accédez à l’emplacement prédéfini et obtenez des travaux. Vous ne vous souciez pas de savoir qui l’a mis là et combien il y en a. Vous faites de votre mieux et chargez-les tous! Il en va de même pour la réception, chaque client obtient son résultat à partir de l’emplacement prédéfini car il sait que c’est l’endroit où les résultats devraient apparaître. Cette conception rend le système plus évolutif et robuste. Dans bert-as-service, vous pouvez simplement tuer le serveur et le redémarrer, le mêmeBertClient fonctionne toujours bien.
Le deuxième avantage est qu’il permet des fonctionnalités intéressantes telles que le codage asynchrone et la multidiffusion. Le codage asynchrone est particulièrement utile lorsque vous souhaitez chevaucher le temps de prétraitement de la phrase et le temps de codage pour des raisons d’efficacité. Désormais, la multidiffusion fait partie de l’ API BertClient , qui permet à plusieurs clients ayant la même identité de recevoir les résultats simultanément tout en n’encodant qu’une seule fois. La figure suivante illustre cette idée. L’exemple complet se trouve ici .

● Tuez les bavardages. Les lecteurs attentifs peuvent remarquer que les données circulent toujours dans le pipeline: tous les messages ne sont pas envoyés en amont mais uniquement en aval vers un autre socket, et les destinataires ne répondent pas aux expéditeurs. Tuer le bavardage est essentiel pour une évolutivité réelle. Lorsque nous supprimons le bavardage, le flux de messages global devient beaucoup plus simple et non bloquant, ce qui nous permet de créer des API et des protocoles plus simples, et en général une latence plus faible.
● Prises multiples entre le ventilateur et les travailleurs. Si la taille d’une demande est inférieure à 16 phrases, le ventilateur pousse le travail vers la première prise (Q0 dans le graphique d’architecture). Sinon, le ventilateur divise le travail en mini-travaux où chacun a au plus 256 phrases, puis poussez ces mini-travaux vers une prise aléatoire de 1 à 7. Les travailleurs continuent de tirer les travaux des huit prises en suivant l’ordre d’index ascendant.
Cela garantit que la petite demande ne sera pas bloquée par la demande à grande et haute fréquence. Une petite demande va toujours à Q0, qui est d’abord tirée par les travailleurs. Pour les demandes à haute et haute fréquence provenant de plusieurs clients, elles seront poussées vers différentes prises et auront une chance égale de calculer sur les travailleurs.
● Processus séparés pour le ventilateur, les travailleurs et l’évier. La séparation des composants au niveau du processus améliore la robustesse et réduit la latence. On peut affirmer que l’évier et le ventilateur peuvent être combinés en un seul module. Mais alors, un message de résultat devrait toujours traverser le processus, ce qui ne réduira pas les coûts de communication. De plus, le fait d’avoir des processus séparés simplifie la logique globale et le flux de messages. Chaque composant se concentre sur un seul travail. Nous pouvons facilement agrandir l’évier ou le ventilateur lorsque l’un ou l’autre devient le goulot d’étranglement.
Enfin, les lecteurs intéressés sont toujours invités à lire directement la source . Pour valider l’efficacité de cette architecture, j’ai comparé le service avec différents paramètres, réalisant ~ 900 phrases / s sur un seul GPU et évoluant bien sur multi-GPU ou avec multi-client. Le résultat complet se trouve dans la dernière section du fichier Github .